From 36e02ec4ddb56e6b1b29337182d56eca709465a7 Mon Sep 17 00:00:00 2001 From: llermaly Date: Sat, 2 Nov 2024 01:26:35 -0500 Subject: [PATCH 1/2] supporting content --- .../ingesting_data_with_onelake_part_i.ipynb | 1839 +++++++++++++++++ 1 file changed, 1839 insertions(+) create mode 100644 supporting-blog-content/ingesting-data-with-onelake-part-i/ingesting_data_with_onelake_part_i.ipynb diff --git a/supporting-blog-content/ingesting-data-with-onelake-part-i/ingesting_data_with_onelake_part_i.ipynb b/supporting-blog-content/ingesting-data-with-onelake-part-i/ingesting_data_with_onelake_part_i.ipynb new file mode 100644 index 00000000..162da4ba --- /dev/null +++ b/supporting-blog-content/ingesting-data-with-onelake-part-i/ingesting_data_with_onelake_part_i.ipynb @@ -0,0 +1,1839 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Ingesting data with OneLake Part I\n", + "\n", + "\n", + "In this notebook we will learn how to index data from Microsoft OneLake [OneLake](https://learn.microsoft.com/en-us/fabric/onelake/onelake-overview) to Elasticsearch. This demonstration is related to the article [Ingesting data with OneLake Part I.](https://www.elastic.co/search-labs/blog/ingesting-data-with-onelake-part-i)\n" + ], + "metadata": { + "id": "GHYboK3ekvbr" + } + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Dzm-AXfcJNIT", + "outputId": "7bb571fa-eb57-4b7e-c729-0bd95fb0a42a" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Collecting elasticsearch==8.14\n", + " Downloading elasticsearch-8.14.0-py3-none-any.whl.metadata (7.2 kB)\n", + "Collecting azure-identity\n", + " Downloading azure_identity-1.19.0-py3-none-any.whl.metadata (80 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m80.6/80.6 kB\u001b[0m \u001b[31m3.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting azure-storage-file-datalake\n", + " Downloading azure_storage_file_datalake-12.17.0-py3-none-any.whl.metadata (16 kB)\n", + "Collecting azure-cli\n", + " Downloading azure_cli-2.65.0-py3-none-any.whl.metadata (8.3 kB)\n", + "Collecting python-docx\n", + " Downloading python_docx-1.1.2-py3-none-any.whl.metadata (2.0 kB)\n", + "Collecting elastic-transport<9,>=8.13 (from elasticsearch==8.14)\n", + " Downloading elastic_transport-8.15.1-py3-none-any.whl.metadata (3.7 kB)\n", + "Collecting azure-core>=1.31.0 (from azure-identity)\n", + " Downloading azure_core-1.32.0-py3-none-any.whl.metadata (39 kB)\n", + "Requirement already satisfied: cryptography>=2.5 in /usr/local/lib/python3.10/dist-packages (from azure-identity) (43.0.3)\n", + "Collecting msal>=1.30.0 (from azure-identity)\n", + " Downloading msal-1.31.0-py3-none-any.whl.metadata (11 kB)\n", + "Collecting msal-extensions>=1.2.0 (from azure-identity)\n", + " Downloading msal_extensions-1.2.0-py3-none-any.whl.metadata (7.6 kB)\n", + "Requirement already satisfied: typing-extensions>=4.0.0 in /usr/local/lib/python3.10/dist-packages (from azure-identity) (4.12.2)\n", + "Collecting azure-storage-blob>=12.23.0 (from azure-storage-file-datalake)\n", + " Downloading azure_storage_blob-12.23.1-py3-none-any.whl.metadata (26 kB)\n", + "Collecting isodate>=0.6.1 (from azure-storage-file-datalake)\n", + " Downloading isodate-0.7.2-py3-none-any.whl.metadata (11 kB)\n", + "Collecting antlr4-python3-runtime~=4.13.1 (from azure-cli)\n", + " Downloading antlr4_python3_runtime-4.13.2-py3-none-any.whl.metadata (304 bytes)\n", + "Collecting azure-appconfiguration~=1.7.0 (from azure-cli)\n", + " Downloading azure_appconfiguration-1.7.1-py3-none-any.whl.metadata (27 kB)\n", + "Collecting azure-batch~=14.2.0 (from azure-cli)\n", + " Downloading azure_batch-14.2.0-py3-none-any.whl.metadata (22 kB)\n", + "Collecting azure-cli-core==2.65.0 (from azure-cli)\n", + " Downloading azure_cli_core-2.65.0-py3-none-any.whl.metadata (1.8 kB)\n", + "Collecting azure-cosmos>=3.0.2,~=3.0 (from azure-cli)\n", + " Downloading azure_cosmos-3.2.0-py2.py3-none-any.whl.metadata (22 kB)\n", + "Collecting azure-data-tables==12.4.0 (from azure-cli)\n", + " Downloading azure_data_tables-12.4.0-py3-none-any.whl.metadata (31 kB)\n", + "Collecting azure-datalake-store~=0.0.53 (from azure-cli)\n", + " Downloading azure_datalake_store-0.0.53-py2.py3-none-any.whl.metadata (19 kB)\n", + "Collecting azure-graphrbac~=0.60.0 (from azure-cli)\n", + " Downloading azure_graphrbac-0.60.0-py2.py3-none-any.whl.metadata (10 kB)\n", + "Collecting azure-keyvault-administration==4.4.0b2 (from azure-cli)\n", + " Downloading azure_keyvault_administration-4.4.0b2-py3-none-any.whl.metadata (30 kB)\n", + "Collecting azure-keyvault-certificates==4.7.0 (from azure-cli)\n", + " Downloading azure_keyvault_certificates-4.7.0-py3-none-any.whl.metadata (34 kB)\n", + "Collecting azure-keyvault-keys==4.9.0b3 (from azure-cli)\n", + " Downloading azure_keyvault_keys-4.9.0b3-py3-none-any.whl.metadata (46 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m46.5/46.5 kB\u001b[0m \u001b[31m2.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting azure-keyvault-secrets==4.7.0 (from azure-cli)\n", + " Downloading azure_keyvault_secrets-4.7.0-py3-none-any.whl.metadata (28 kB)\n", + "Collecting azure-mgmt-advisor==9.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_advisor-9.0.0-py2.py3-none-any.whl.metadata (8.6 kB)\n", + "Collecting azure-mgmt-apimanagement==4.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_apimanagement-4.0.0-py3-none-any.whl.metadata (24 kB)\n", + "Collecting azure-mgmt-appconfiguration==3.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_appconfiguration-3.0.0-py3-none-any.whl.metadata (9.3 kB)\n", + "Collecting azure-mgmt-appcontainers==2.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_appcontainers-2.0.0-py3-none-any.whl.metadata (19 kB)\n", + "Collecting azure-mgmt-applicationinsights~=1.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_applicationinsights-1.0.0-py2.py3-none-any.whl.metadata (11 kB)\n", + "Collecting azure-mgmt-authorization~=4.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_authorization-4.0.0-py3-none-any.whl.metadata (18 kB)\n", + "Collecting azure-mgmt-batchai==7.0.0b1 (from azure-cli)\n", + " Downloading azure_mgmt_batchai-7.0.0b1-py2.py3-none-any.whl.metadata (8.9 kB)\n", + "Collecting azure-mgmt-batch~=17.3.0 (from azure-cli)\n", + " Downloading azure_mgmt_batch-17.3.0-py3-none-any.whl.metadata (19 kB)\n", + "Collecting azure-mgmt-billing==6.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_billing-6.0.0-py2.py3-none-any.whl.metadata (7.5 kB)\n", + "Collecting azure-mgmt-botservice~=2.0.0b3 (from azure-cli)\n", + " Downloading azure_mgmt_botservice-2.0.0-py3-none-any.whl.metadata (18 kB)\n", + "Collecting azure-mgmt-cdn==12.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_cdn-12.0.0-py3-none-any.whl.metadata (25 kB)\n", + "Collecting azure-mgmt-cognitiveservices~=13.5.0 (from azure-cli)\n", + " Downloading azure_mgmt_cognitiveservices-13.5.0-py3-none-any.whl.metadata (18 kB)\n", + "Collecting azure-mgmt-compute~=33.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_compute-33.0.0-py3-none-any.whl.metadata (69 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m69.4/69.4 kB\u001b[0m \u001b[31m4.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting azure-mgmt-containerinstance==10.1.0 (from azure-cli)\n", + " Downloading azure_mgmt_containerinstance-10.1.0-py3-none-any.whl.metadata (13 kB)\n", + "Collecting azure-mgmt-containerregistry==10.3.0 (from azure-cli)\n", + " Downloading azure_mgmt_containerregistry-10.3.0-py3-none-any.whl.metadata (23 kB)\n", + "Collecting azure-mgmt-containerservice~=32.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_containerservice-32.0.0-py3-none-any.whl.metadata (52 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m52.0/52.0 kB\u001b[0m \u001b[31m2.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting azure-mgmt-cosmosdb==9.6.0 (from azure-cli)\n", + " Downloading azure_mgmt_cosmosdb-9.6.0-py3-none-any.whl.metadata (108 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m108.2/108.2 kB\u001b[0m \u001b[31m6.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting azure-mgmt-databoxedge~=1.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_databoxedge-1.0.0-py2.py3-none-any.whl.metadata (8.4 kB)\n", + "Collecting azure-mgmt-datamigration~=10.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_datamigration-10.0.0-py2.py3-none-any.whl.metadata (13 kB)\n", + "Collecting azure-mgmt-devtestlabs~=4.0 (from azure-cli)\n", + " Downloading azure_mgmt_devtestlabs-4.0.0-py2.py3-none-any.whl.metadata (10 kB)\n", + "Collecting azure-mgmt-dns~=8.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_dns-8.0.0-py2.py3-none-any.whl.metadata (8.9 kB)\n", + "Collecting azure-mgmt-eventgrid==10.2.0b2 (from azure-cli)\n", + " Downloading azure_mgmt_eventgrid-10.2.0b2-py3-none-any.whl.metadata (23 kB)\n", + "Collecting azure-mgmt-eventhub~=10.1.0 (from azure-cli)\n", + " Downloading azure_mgmt_eventhub-10.1.0-py3-none-any.whl.metadata (15 kB)\n", + "Collecting azure-mgmt-extendedlocation==1.0.0b2 (from azure-cli)\n", + " Downloading azure_mgmt_extendedlocation-1.0.0b2-py2.py3-none-any.whl.metadata (2.4 kB)\n", + "Collecting azure-mgmt-hdinsight==9.0.0b3 (from azure-cli)\n", + " Downloading azure_mgmt_hdinsight-9.0.0b3-py3-none-any.whl.metadata (15 kB)\n", + "Collecting azure-mgmt-imagebuilder~=1.3.0 (from azure-cli)\n", + " Downloading azure_mgmt_imagebuilder-1.3.0-py3-none-any.whl.metadata (9.4 kB)\n", + "Collecting azure-mgmt-iotcentral~=10.0.0b1 (from azure-cli)\n", + " Downloading azure_mgmt_iotcentral-10.0.0b2-py3-none-any.whl.metadata (8.3 kB)\n", + "Collecting azure-mgmt-iothub==3.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_iothub-3.0.0-py3-none-any.whl.metadata (16 kB)\n", + "Collecting azure-mgmt-iothubprovisioningservices==1.1.0 (from azure-cli)\n", + " Downloading azure_mgmt_iothubprovisioningservices-1.1.0-py3-none-any.whl.metadata (7.3 kB)\n", + "Collecting azure-mgmt-keyvault==10.3.0 (from azure-cli)\n", + " Downloading azure_mgmt_keyvault-10.3.0-py3-none-any.whl.metadata (15 kB)\n", + "Collecting azure-mgmt-kusto~=0.3.0 (from azure-cli)\n", + " Downloading azure_mgmt_kusto-0.3.0-py2.py3-none-any.whl.metadata (4.7 kB)\n", + "Collecting azure-mgmt-loganalytics==13.0.0b4 (from azure-cli)\n", + " Downloading azure_mgmt_loganalytics-13.0.0b4-py3-none-any.whl.metadata (17 kB)\n", + "Collecting azure-mgmt-managementgroups~=1.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_managementgroups-1.0.0-py2.py3-none-any.whl.metadata (5.6 kB)\n", + "Collecting azure-mgmt-maps~=2.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_maps-2.0.0-py2.py3-none-any.whl.metadata (5.6 kB)\n", + "Collecting azure-mgmt-marketplaceordering==1.1.0 (from azure-cli)\n", + " Downloading azure_mgmt_marketplaceordering-1.1.0-py2.py3-none-any.whl.metadata (7.5 kB)\n", + "Collecting azure-mgmt-media~=9.0 (from azure-cli)\n", + " Downloading azure_mgmt_media-9.0.0-py3-none-any.whl.metadata (14 kB)\n", + "Collecting azure-mgmt-monitor~=5.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_monitor-5.0.1-py3-none-any.whl.metadata (24 kB)\n", + "Collecting azure-mgmt-msi~=7.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_msi-7.0.0-py3-none-any.whl.metadata (8.9 kB)\n", + "Collecting azure-mgmt-netapp~=10.1.0 (from azure-cli)\n", + " Downloading azure_mgmt_netapp-10.1.0-py3-none-any.whl.metadata (21 kB)\n", + "Collecting azure-mgmt-policyinsights==1.1.0b4 (from azure-cli)\n", + " Downloading azure_mgmt_policyinsights-1.1.0b4-py3-none-any.whl.metadata (11 kB)\n", + "Collecting azure-mgmt-privatedns~=1.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_privatedns-1.0.0-py2.py3-none-any.whl.metadata (4.9 kB)\n", + "Collecting azure-mgmt-rdbms~=10.2.0b16 (from azure-cli)\n", + " Downloading azure_mgmt_rdbms-10.2.0b18-py3-none-any.whl.metadata (33 kB)\n", + "Collecting azure-mgmt-recoveryservicesbackup~=9.1.0 (from azure-cli)\n", + " Downloading azure_mgmt_recoveryservicesbackup-9.1.0-py3-none-any.whl.metadata (36 kB)\n", + "Collecting azure-mgmt-recoveryservices~=3.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_recoveryservices-3.0.0-py3-none-any.whl.metadata (13 kB)\n", + "Collecting azure-mgmt-redhatopenshift~=1.5.0 (from azure-cli)\n", + " Downloading azure_mgmt_redhatopenshift-1.5.0-py3-none-any.whl.metadata (7.0 kB)\n", + "Collecting azure-mgmt-redis~=14.4.0 (from azure-cli)\n", + " Downloading azure_mgmt_redis-14.4.0-py3-none-any.whl.metadata (16 kB)\n", + "Collecting azure-mgmt-resource==23.1.1 (from azure-cli)\n", + " Downloading azure_mgmt_resource-23.1.1-py3-none-any.whl.metadata (37 kB)\n", + "Collecting azure-mgmt-search~=9.0 (from azure-cli)\n", + " Downloading azure_mgmt_search-9.1.0-py3-none-any.whl.metadata (10 kB)\n", + "Collecting azure-mgmt-security==6.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_security-6.0.0-py3-none-any.whl.metadata (31 kB)\n", + "Collecting azure-mgmt-servicebus~=8.2.0 (from azure-cli)\n", + " Downloading azure_mgmt_servicebus-8.2.0-py3-none-any.whl.metadata (15 kB)\n", + "Collecting azure-mgmt-servicefabricmanagedclusters==2.0.0b6 (from azure-cli)\n", + " Downloading azure_mgmt_servicefabricmanagedclusters-2.0.0b6-py3-none-any.whl.metadata (9.1 kB)\n", + "Collecting azure-mgmt-servicelinker==1.2.0b2 (from azure-cli)\n", + " Downloading azure_mgmt_servicelinker-1.2.0b2-py3-none-any.whl.metadata (7.2 kB)\n", + "Collecting azure-mgmt-servicefabric~=2.1.0 (from azure-cli)\n", + " Downloading azure_mgmt_servicefabric-2.1.0-py3-none-any.whl.metadata (13 kB)\n", + "Collecting azure-mgmt-signalr==2.0.0b1 (from azure-cli)\n", + " Downloading azure_mgmt_signalr-2.0.0b1-py3-none-any.whl.metadata (9.9 kB)\n", + "Collecting azure-mgmt-sqlvirtualmachine==1.0.0b5 (from azure-cli)\n", + " Downloading azure_mgmt_sqlvirtualmachine-1.0.0b5-py3-none-any.whl.metadata (8.8 kB)\n", + "Collecting azure-mgmt-sql==4.0.0b19 (from azure-cli)\n", + " Downloading azure_mgmt_sql-4.0.0b19-py3-none-any.whl.metadata (70 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m70.7/70.7 kB\u001b[0m \u001b[31m5.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting azure-mgmt-storage==21.2.0 (from azure-cli)\n", + " Downloading azure_mgmt_storage-21.2.0-py3-none-any.whl.metadata (30 kB)\n", + "Collecting azure-mgmt-synapse==2.1.0b5 (from azure-cli)\n", + " Downloading azure_mgmt_synapse-2.1.0b5-py3-none-any.whl.metadata (15 kB)\n", + "Collecting azure-mgmt-trafficmanager~=1.0.0 (from azure-cli)\n", + " Downloading azure_mgmt_trafficmanager-1.0.0-py3-none-any.whl.metadata (7.8 kB)\n", + "Collecting azure-mgmt-web==7.2.0 (from azure-cli)\n", + " Downloading azure_mgmt_web-7.2.0-py3-none-any.whl.metadata (87 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m87.3/87.3 kB\u001b[0m \u001b[31m6.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hCollecting azure-monitor-query==1.2.0 (from azure-cli)\n", + " Downloading azure_monitor_query-1.2.0-py3-none-any.whl.metadata (32 kB)\n", + "Collecting azure-multiapi-storage~=1.3.0 (from azure-cli)\n", + " Downloading azure_multiapi_storage-1.3.0-py2.py3-none-any.whl.metadata (6.5 kB)\n", + "Collecting azure-storage-common~=1.4 (from azure-cli)\n", + " Downloading azure_storage_common-1.4.2-py2.py3-none-any.whl.metadata (8.1 kB)\n", + "Collecting azure-synapse-accesscontrol~=0.5.0 (from azure-cli)\n", + " Downloading azure_synapse_accesscontrol-0.5.0-py2.py3-none-any.whl.metadata (2.1 kB)\n", + "Collecting azure-synapse-artifacts~=0.19.0 (from azure-cli)\n", + " Downloading azure_synapse_artifacts-0.19.0-py3-none-any.whl.metadata (17 kB)\n", + "Collecting azure-synapse-managedprivateendpoints~=0.4.0 (from azure-cli)\n", + " Downloading azure_synapse_managedprivateendpoints-0.4.0-py2.py3-none-any.whl.metadata (2.3 kB)\n", + "Collecting azure-synapse-spark~=0.2.0 (from azure-cli)\n", + " Downloading azure_synapse_spark-0.2.0-py2.py3-none-any.whl.metadata (1.8 kB)\n", + "Requirement already satisfied: chardet~=5.2.0 in /usr/local/lib/python3.10/dist-packages (from azure-cli) (5.2.0)\n", + "Collecting colorama~=0.4.4 (from azure-cli)\n", + " Downloading colorama-0.4.6-py2.py3-none-any.whl.metadata (17 kB)\n", + "Collecting fabric~=3.2.2 (from azure-cli)\n", + " Downloading fabric-3.2.2-py3-none-any.whl.metadata (3.5 kB)\n", + "Collecting javaproperties~=0.5.1 (from azure-cli)\n", + " Downloading javaproperties-0.5.2-py2.py3-none-any.whl.metadata (5.8 kB)\n", + "Collecting jsondiff~=2.0.0 (from azure-cli)\n", + " Downloading jsondiff-2.0.0-py3-none-any.whl.metadata (562 bytes)\n", + "Requirement already satisfied: packaging>=20.9 in /usr/local/lib/python3.10/dist-packages (from azure-cli) (24.1)\n", + "Collecting pycomposefile>=0.0.29 (from azure-cli)\n", + " Downloading pycomposefile-0.0.32-py3-none-any.whl.metadata (356 bytes)\n", + "Collecting PyGithub~=1.38 (from azure-cli)\n", + " Downloading PyGithub-1.59.1-py3-none-any.whl.metadata (2.0 kB)\n", + "Collecting PyNaCl~=1.5.0 (from azure-cli)\n", + " Downloading PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl.metadata (8.6 kB)\n", + "Collecting scp~=0.13.2 (from azure-cli)\n", + " Downloading scp-0.13.6-py2.py3-none-any.whl.metadata (4.5 kB)\n", + "Collecting semver==2.13.0 (from azure-cli)\n", + " Downloading semver-2.13.0-py2.py3-none-any.whl.metadata (5.0 kB)\n", + "Requirement already satisfied: setuptools in /usr/local/lib/python3.10/dist-packages (from azure-cli) (75.1.0)\n", + "Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.10/dist-packages (from azure-cli) (1.16.0)\n", + "Collecting sshtunnel~=0.1.4 (from azure-cli)\n", + " Downloading sshtunnel-0.1.5-py2.py3-none-any.whl.metadata (17 kB)\n", + "Requirement already satisfied: tabulate in /usr/local/lib/python3.10/dist-packages (from azure-cli) (0.9.0)\n", + "Requirement already satisfied: urllib3 in /usr/local/lib/python3.10/dist-packages (from azure-cli) (2.2.3)\n", + "Collecting websocket-client~=1.3.1 (from azure-cli)\n", + " Downloading websocket_client-1.3.3-py3-none-any.whl.metadata (6.9 kB)\n", + "Collecting xmltodict~=0.12 (from azure-cli)\n", + " Downloading xmltodict-0.14.2-py2.py3-none-any.whl.metadata (8.0 kB)\n", + "Requirement already satisfied: distro in /usr/local/lib/python3.10/dist-packages (from azure-cli) (1.9.0)\n", + "Collecting argcomplete~=3.3.0 (from azure-cli-core==2.65.0->azure-cli)\n", + " Downloading argcomplete-3.3.0-py3-none-any.whl.metadata (16 kB)\n", + "Collecting azure-cli-telemetry==1.1.0.* (from azure-cli-core==2.65.0->azure-cli)\n", + " Downloading azure_cli_telemetry-1.1.0-py3-none-any.whl.metadata (1.8 kB)\n", + "Collecting azure-mgmt-core<2,>=1.2.0 (from azure-cli-core==2.65.0->azure-cli)\n", + " Downloading azure_mgmt_core-1.5.0-py3-none-any.whl.metadata (4.3 kB)\n", + "Collecting humanfriendly~=10.0 (from azure-cli-core==2.65.0->azure-cli)\n", + " Downloading humanfriendly-10.0-py2.py3-none-any.whl.metadata (9.2 kB)\n", + "Collecting jmespath (from azure-cli-core==2.65.0->azure-cli)\n", + " Downloading jmespath-1.0.1-py3-none-any.whl.metadata (7.6 kB)\n", + "Collecting knack~=0.11.0 (from azure-cli-core==2.65.0->azure-cli)\n", + " Downloading knack-0.11.0-py3-none-any.whl.metadata (5.2 kB)\n", + "Collecting msrestazure~=0.6.4 (from azure-cli-core==2.65.0->azure-cli)\n", + " Downloading msrestazure-0.6.4.post1-py2.py3-none-any.whl.metadata (15 kB)\n", + "Collecting paramiko<4.0.0,>=2.0.8 (from azure-cli-core==2.65.0->azure-cli)\n", + " Downloading paramiko-3.5.0-py3-none-any.whl.metadata (4.4 kB)\n", + "Collecting pkginfo>=1.5.0.1 (from azure-cli-core==2.65.0->azure-cli)\n", + " Downloading pkginfo-1.11.2-py3-none-any.whl.metadata (11 kB)\n", + "Requirement already satisfied: PyJWT>=2.1.0 in /usr/local/lib/python3.10/dist-packages (from azure-cli-core==2.65.0->azure-cli) (2.9.0)\n", + "Requirement already satisfied: pyopenssl>=17.1.0 in /usr/local/lib/python3.10/dist-packages (from azure-cli-core==2.65.0->azure-cli) (24.2.1)\n", + "Requirement already satisfied: requests[socks] in /usr/local/lib/python3.10/dist-packages (from azure-cli-core==2.65.0->azure-cli) (2.32.3)\n", + "Collecting microsoft-security-utilities-secret-masker~=1.0.0b2 (from azure-cli-core==2.65.0->azure-cli)\n", + " Downloading microsoft_security_utilities_secret_masker-1.0.0b3-py3-none-any.whl.metadata (3.2 kB)\n", + "Requirement already satisfied: psutil>=5.9 in /usr/local/lib/python3.10/dist-packages (from azure-cli-core==2.65.0->azure-cli) (5.9.5)\n", + "Collecting msrest>=0.6.21 (from azure-data-tables==12.4.0->azure-cli)\n", + " Downloading msrest-0.7.1-py3-none-any.whl.metadata (21 kB)\n", + "Collecting azure-common~=1.1 (from azure-keyvault-administration==4.4.0b2->azure-cli)\n", + " Downloading azure_common-1.1.28-py2.py3-none-any.whl.metadata (5.0 kB)\n", + "Collecting portalocker<3,>=1.4 (from msal-extensions>=1.2.0->azure-identity)\n", + " Downloading portalocker-2.10.1-py3-none-any.whl.metadata (8.5 kB)\n", + "Collecting applicationinsights<0.12,>=0.11.1 (from azure-cli-telemetry==1.1.0.*->azure-cli-core==2.65.0->azure-cli)\n", + " Downloading applicationinsights-0.11.10-py2.py3-none-any.whl.metadata (982 bytes)\n", + "Requirement already satisfied: lxml>=3.1.0 in /usr/local/lib/python3.10/dist-packages (from python-docx) (5.3.0)\n", + "Requirement already satisfied: cffi in /usr/local/lib/python3.10/dist-packages (from azure-datalake-store~=0.0.53->azure-cli) (1.17.1)\n", + "Requirement already satisfied: python-dateutil in /usr/local/lib/python3.10/dist-packages (from azure-multiapi-storage~=1.3.0->azure-cli) (2.8.2)\n", + "Requirement already satisfied: certifi in /usr/local/lib/python3.10/dist-packages (from elastic-transport<9,>=8.13->elasticsearch==8.14) (2024.8.30)\n", + "Collecting invoke>=2.0 (from fabric~=3.2.2->azure-cli)\n", + " Downloading invoke-2.2.0-py3-none-any.whl.metadata (3.3 kB)\n", + "Collecting decorator>=5 (from fabric~=3.2.2->azure-cli)\n", + " Downloading decorator-5.1.1-py3-none-any.whl.metadata (4.0 kB)\n", + "Requirement already satisfied: deprecated>=1.2 in /usr/local/lib/python3.10/dist-packages (from fabric~=3.2.2->azure-cli) (1.2.14)\n", + "Requirement already satisfied: pyyaml in /usr/local/lib/python3.10/dist-packages (from pycomposefile>=0.0.29->azure-cli) (6.0.2)\n", + "Requirement already satisfied: pycparser in /usr/local/lib/python3.10/dist-packages (from cffi->azure-datalake-store~=0.0.53->azure-cli) (2.22)\n", + "Requirement already satisfied: wrapt<2,>=1.10 in /usr/local/lib/python3.10/dist-packages (from deprecated>=1.2->fabric~=3.2.2->azure-cli) (1.16.0)\n", + "Requirement already satisfied: pygments in /usr/local/lib/python3.10/dist-packages (from knack~=0.11.0->azure-cli-core==2.65.0->azure-cli) (2.18.0)\n", + "Requirement already satisfied: requests-oauthlib>=0.5.0 in /usr/local/lib/python3.10/dist-packages (from msrest>=0.6.21->azure-data-tables==12.4.0->azure-cli) (1.3.1)\n", + "Collecting adal<2.0.0,>=0.6.0 (from msrestazure~=0.6.4->azure-cli-core==2.65.0->azure-cli)\n", + " Downloading adal-1.2.7-py2.py3-none-any.whl.metadata (6.9 kB)\n", + "Collecting bcrypt>=3.2 (from paramiko<4.0.0,>=2.0.8->azure-cli-core==2.65.0->azure-cli)\n", + " Downloading bcrypt-4.2.0-cp39-abi3-manylinux_2_28_x86_64.whl.metadata (9.6 kB)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests[socks]->azure-cli-core==2.65.0->azure-cli) (3.4.0)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests[socks]->azure-cli-core==2.65.0->azure-cli) (3.10)\n", + "Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /usr/local/lib/python3.10/dist-packages (from requests[socks]->azure-cli-core==2.65.0->azure-cli) (1.7.1)\n", + "Requirement already satisfied: oauthlib>=3.0.0 in /usr/local/lib/python3.10/dist-packages (from requests-oauthlib>=0.5.0->msrest>=0.6.21->azure-data-tables==12.4.0->azure-cli) (3.2.2)\n", + "Downloading elasticsearch-8.14.0-py3-none-any.whl (480 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m480.2/480.2 kB\u001b[0m \u001b[31m26.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_identity-1.19.0-py3-none-any.whl (187 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m187.6/187.6 kB\u001b[0m \u001b[31m13.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_storage_file_datalake-12.17.0-py3-none-any.whl (255 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m255.7/255.7 kB\u001b[0m \u001b[31m20.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_cli-2.65.0-py3-none-any.whl (14.3 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m14.3/14.3 MB\u001b[0m \u001b[31m60.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_cli_core-2.65.0-py3-none-any.whl (257 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m257.7/257.7 kB\u001b[0m \u001b[31m15.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_data_tables-12.4.0-py3-none-any.whl (113 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m113.9/113.9 kB\u001b[0m \u001b[31m7.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_keyvault_administration-4.4.0b2-py3-none-any.whl (105 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m105.1/105.1 kB\u001b[0m \u001b[31m8.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_keyvault_certificates-4.7.0-py3-none-any.whl (428 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m428.1/428.1 kB\u001b[0m \u001b[31m24.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_keyvault_keys-4.9.0b3-py3-none-any.whl (149 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m149.5/149.5 kB\u001b[0m \u001b[31m9.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_keyvault_secrets-4.7.0-py3-none-any.whl (348 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m348.6/348.6 kB\u001b[0m \u001b[31m20.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_advisor-9.0.0-py2.py3-none-any.whl (46 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m46.9/46.9 kB\u001b[0m \u001b[31m3.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_apimanagement-4.0.0-py3-none-any.whl (804 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m804.5/804.5 kB\u001b[0m \u001b[31m38.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_appconfiguration-3.0.0-py3-none-any.whl (252 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m252.0/252.0 kB\u001b[0m \u001b[31m17.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_appcontainers-2.0.0-py3-none-any.whl (214 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m214.1/214.1 kB\u001b[0m \u001b[31m13.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_batchai-7.0.0b1-py2.py3-none-any.whl (99 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m99.1/99.1 kB\u001b[0m \u001b[31m7.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_billing-6.0.0-py2.py3-none-any.whl (166 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m167.0/167.0 kB\u001b[0m \u001b[31m12.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_cdn-12.0.0-py3-none-any.whl (239 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m239.4/239.4 kB\u001b[0m \u001b[31m16.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_containerinstance-10.1.0-py3-none-any.whl (87 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m87.3/87.3 kB\u001b[0m \u001b[31m7.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_containerregistry-10.3.0-py3-none-any.whl (2.3 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.3/2.3 MB\u001b[0m \u001b[31m51.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_cosmosdb-9.6.0-py3-none-any.whl (387 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m387.9/387.9 kB\u001b[0m \u001b[31m18.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_eventgrid-10.2.0b2-py3-none-any.whl (248 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m248.5/248.5 kB\u001b[0m \u001b[31m12.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_extendedlocation-1.0.0b2-py2.py3-none-any.whl (37 kB)\n", + "Downloading azure_mgmt_hdinsight-9.0.0b3-py3-none-any.whl (144 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m144.4/144.4 kB\u001b[0m \u001b[31m10.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_iothub-3.0.0-py3-none-any.whl (1.3 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.3/1.3 MB\u001b[0m \u001b[31m51.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_iothubprovisioningservices-1.1.0-py3-none-any.whl (52 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m52.5/52.5 kB\u001b[0m \u001b[31m4.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_keyvault-10.3.0-py3-none-any.whl (933 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m933.0/933.0 kB\u001b[0m \u001b[31m40.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_loganalytics-13.0.0b4-py3-none-any.whl (162 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m162.6/162.6 kB\u001b[0m \u001b[31m8.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_marketplaceordering-1.1.0-py2.py3-none-any.whl (26 kB)\n", + "Downloading azure_mgmt_policyinsights-1.1.0b4-py3-none-any.whl (127 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m127.0/127.0 kB\u001b[0m \u001b[31m8.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_resource-23.1.1-py3-none-any.whl (2.6 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.6/2.6 MB\u001b[0m \u001b[31m66.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_security-6.0.0-py3-none-any.whl (1.1 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.1/1.1 MB\u001b[0m \u001b[31m49.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_servicefabricmanagedclusters-2.0.0b6-py3-none-any.whl (204 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m204.4/204.4 kB\u001b[0m \u001b[31m13.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_servicelinker-1.2.0b2-py3-none-any.whl (95 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m95.1/95.1 kB\u001b[0m \u001b[31m7.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_signalr-2.0.0b1-py3-none-any.whl (123 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m123.6/123.6 kB\u001b[0m \u001b[31m9.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_sql-4.0.0b19-py3-none-any.whl (1.2 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.2/1.2 MB\u001b[0m \u001b[31m19.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_sqlvirtualmachine-1.0.0b5-py3-none-any.whl (95 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m95.3/95.3 kB\u001b[0m \u001b[31m4.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_storage-21.2.0-py3-none-any.whl (3.2 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.2/3.2 MB\u001b[0m \u001b[31m62.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_synapse-2.1.0b5-py3-none-any.whl (547 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m547.1/547.1 kB\u001b[0m \u001b[31m33.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_web-7.2.0-py3-none-any.whl (6.0 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m6.0/6.0 MB\u001b[0m \u001b[31m65.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_monitor_query-1.2.0-py3-none-any.whl (113 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m113.4/113.4 kB\u001b[0m \u001b[31m10.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading msal-1.31.0-py3-none-any.whl (113 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m113.1/113.1 kB\u001b[0m \u001b[31m10.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading msal_extensions-1.2.0-py3-none-any.whl (19 kB)\n", + "Downloading semver-2.13.0-py2.py3-none-any.whl (12 kB)\n", + "Downloading azure_cli_telemetry-1.1.0-py3-none-any.whl (11 kB)\n", + "Downloading python_docx-1.1.2-py3-none-any.whl (244 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m244.3/244.3 kB\u001b[0m \u001b[31m20.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading antlr4_python3_runtime-4.13.2-py3-none-any.whl (144 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m144.5/144.5 kB\u001b[0m \u001b[31m12.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_appconfiguration-1.7.1-py3-none-any.whl (90 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m91.0/91.0 kB\u001b[0m \u001b[31m6.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_batch-14.2.0-py3-none-any.whl (243 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m243.3/243.3 kB\u001b[0m \u001b[31m18.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_core-1.32.0-py3-none-any.whl (198 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m198.9/198.9 kB\u001b[0m \u001b[31m18.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_cosmos-3.2.0-py2.py3-none-any.whl (106 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m106.6/106.6 kB\u001b[0m \u001b[31m9.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_datalake_store-0.0.53-py2.py3-none-any.whl (55 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m55.3/55.3 kB\u001b[0m \u001b[31m4.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_graphrbac-0.60.0-py2.py3-none-any.whl (139 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m139.7/139.7 kB\u001b[0m \u001b[31m9.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_applicationinsights-1.0.0-py2.py3-none-any.whl (302 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m303.0/303.0 kB\u001b[0m \u001b[31m20.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_authorization-4.0.0-py3-none-any.whl (1.1 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.1/1.1 MB\u001b[0m \u001b[31m47.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_batch-17.3.0-py3-none-any.whl (162 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m162.1/162.1 kB\u001b[0m \u001b[31m11.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_botservice-2.0.0-py3-none-any.whl (126 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m126.5/126.5 kB\u001b[0m \u001b[31m10.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_cognitiveservices-13.5.0-py3-none-any.whl (144 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m144.3/144.3 kB\u001b[0m \u001b[31m11.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_compute-33.0.0-py3-none-any.whl (5.9 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m5.9/5.9 MB\u001b[0m \u001b[31m64.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_containerservice-32.0.0-py3-none-any.whl (10.3 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m10.3/10.3 MB\u001b[0m \u001b[31m60.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_databoxedge-1.0.0-py2.py3-none-any.whl (1.3 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.3/1.3 MB\u001b[0m \u001b[31m42.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_datamigration-10.0.0-py2.py3-none-any.whl (174 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m174.5/174.5 kB\u001b[0m \u001b[31m12.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_devtestlabs-4.0.0-py2.py3-none-any.whl (137 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m137.0/137.0 kB\u001b[0m \u001b[31m10.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_dns-8.0.0-py2.py3-none-any.whl (118 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m118.9/118.9 kB\u001b[0m \u001b[31m9.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_eventhub-10.1.0-py3-none-any.whl (598 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m598.9/598.9 kB\u001b[0m \u001b[31m30.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_imagebuilder-1.3.0-py3-none-any.whl (78 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m78.1/78.1 kB\u001b[0m \u001b[31m5.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_iotcentral-10.0.0b2-py3-none-any.whl (55 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m55.4/55.4 kB\u001b[0m \u001b[31m3.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_kusto-0.3.0-py2.py3-none-any.whl (73 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m73.9/73.9 kB\u001b[0m \u001b[31m6.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_managementgroups-1.0.0-py2.py3-none-any.whl (58 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m58.1/58.1 kB\u001b[0m \u001b[31m3.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_maps-2.0.0-py2.py3-none-any.whl (38 kB)\n", + "Downloading azure_mgmt_media-9.0.0-py3-none-any.whl (211 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m211.1/211.1 kB\u001b[0m \u001b[31m14.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_monitor-5.0.1-py3-none-any.whl (1.1 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.1/1.1 MB\u001b[0m \u001b[31m40.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_msi-7.0.0-py3-none-any.whl (183 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m183.4/183.4 kB\u001b[0m \u001b[31m12.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_netapp-10.1.0-py3-none-any.whl (200 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m200.7/200.7 kB\u001b[0m \u001b[31m16.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_privatedns-1.0.0-py2.py3-none-any.whl (43 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m44.0/44.0 kB\u001b[0m \u001b[31m2.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_rdbms-10.2.0b18-py3-none-any.whl (556 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m556.6/556.6 kB\u001b[0m \u001b[31m32.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_recoveryservices-3.0.0-py3-none-any.whl (108 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m108.6/108.6 kB\u001b[0m \u001b[31m9.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_recoveryservicesbackup-9.1.0-py3-none-any.whl (570 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m570.9/570.9 kB\u001b[0m \u001b[31m32.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_redhatopenshift-1.5.0-py3-none-any.whl (408 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m408.4/408.4 kB\u001b[0m \u001b[31m20.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_redis-14.4.0-py3-none-any.whl (127 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m127.4/127.4 kB\u001b[0m \u001b[31m8.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_search-9.1.0-py3-none-any.whl (110 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m110.3/110.3 kB\u001b[0m \u001b[31m10.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_servicebus-8.2.0-py3-none-any.whl (940 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m940.1/940.1 kB\u001b[0m \u001b[31m40.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_servicefabric-2.1.0-py3-none-any.whl (124 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m124.3/124.3 kB\u001b[0m \u001b[31m11.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_mgmt_trafficmanager-1.0.0-py3-none-any.whl (49 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m49.3/49.3 kB\u001b[0m \u001b[31m3.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_multiapi_storage-1.3.0-py2.py3-none-any.whl (2.9 MB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.9/2.9 MB\u001b[0m \u001b[31m50.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_storage_blob-12.23.1-py3-none-any.whl (405 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m405.6/405.6 kB\u001b[0m \u001b[31m24.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_storage_common-1.4.2-py2.py3-none-any.whl (47 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m47.4/47.4 kB\u001b[0m \u001b[31m3.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_synapse_accesscontrol-0.5.0-py2.py3-none-any.whl (30 kB)\n", + "Downloading azure_synapse_artifacts-0.19.0-py3-none-any.whl (495 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m495.8/495.8 kB\u001b[0m \u001b[31m33.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_synapse_managedprivateendpoints-0.4.0-py2.py3-none-any.whl (45 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m46.0/46.0 kB\u001b[0m \u001b[31m3.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_synapse_spark-0.2.0-py2.py3-none-any.whl (29 kB)\n", + "Downloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)\n", + "Downloading elastic_transport-8.15.1-py3-none-any.whl (64 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m64.4/64.4 kB\u001b[0m \u001b[31m3.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading fabric-3.2.2-py3-none-any.whl (59 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m59.4/59.4 kB\u001b[0m \u001b[31m4.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading isodate-0.7.2-py3-none-any.whl (22 kB)\n", + "Downloading javaproperties-0.5.2-py2.py3-none-any.whl (19 kB)\n", + "Downloading jsondiff-2.0.0-py3-none-any.whl (6.6 kB)\n", + "Downloading pycomposefile-0.0.32-py3-none-any.whl (28 kB)\n", + "Downloading PyGithub-1.59.1-py3-none-any.whl (342 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m342.2/342.2 kB\u001b[0m \u001b[31m27.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl (856 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m856.7/856.7 kB\u001b[0m \u001b[31m42.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading scp-0.13.6-py2.py3-none-any.whl (8.2 kB)\n", + "Downloading sshtunnel-0.1.5-py2.py3-none-any.whl (23 kB)\n", + "Downloading websocket_client-1.3.3-py3-none-any.whl (54 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m54.3/54.3 kB\u001b[0m \u001b[31m4.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading xmltodict-0.14.2-py2.py3-none-any.whl (10.0 kB)\n", + "Downloading argcomplete-3.3.0-py3-none-any.whl (42 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m42.6/42.6 kB\u001b[0m \u001b[31m3.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading azure_common-1.1.28-py2.py3-none-any.whl (14 kB)\n", + "Downloading azure_mgmt_core-1.5.0-py3-none-any.whl (30 kB)\n", + "Downloading decorator-5.1.1-py3-none-any.whl (9.1 kB)\n", + "Downloading humanfriendly-10.0-py2.py3-none-any.whl (86 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m86.8/86.8 kB\u001b[0m \u001b[31m6.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading invoke-2.2.0-py3-none-any.whl (160 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m160.3/160.3 kB\u001b[0m \u001b[31m13.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading knack-0.11.0-py3-none-any.whl (60 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m60.8/60.8 kB\u001b[0m \u001b[31m5.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading microsoft_security_utilities_secret_masker-1.0.0b3-py3-none-any.whl (16 kB)\n", + "Downloading msrest-0.7.1-py3-none-any.whl (85 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m85.4/85.4 kB\u001b[0m \u001b[31m7.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading msrestazure-0.6.4.post1-py2.py3-none-any.whl (40 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m40.8/40.8 kB\u001b[0m \u001b[31m2.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading paramiko-3.5.0-py3-none-any.whl (227 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m227.1/227.1 kB\u001b[0m \u001b[31m18.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading pkginfo-1.11.2-py3-none-any.whl (31 kB)\n", + "Downloading portalocker-2.10.1-py3-none-any.whl (18 kB)\n", + "Downloading jmespath-1.0.1-py3-none-any.whl (20 kB)\n", + "Downloading adal-1.2.7-py2.py3-none-any.whl (55 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m55.5/55.5 kB\u001b[0m \u001b[31m4.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading applicationinsights-0.11.10-py2.py3-none-any.whl (55 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m55.1/55.1 kB\u001b[0m \u001b[31m3.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hDownloading bcrypt-4.2.0-cp39-abi3-manylinux_2_28_x86_64.whl (273 kB)\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m273.8/273.8 kB\u001b[0m \u001b[31m20.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hInstalling collected packages: microsoft-security-utilities-secret-masker, jsondiff, azure-common, applicationinsights, antlr4-python3-runtime, xmltodict, websocket-client, semver, python-docx, pycomposefile, portalocker, pkginfo, jmespath, javaproperties, isodate, invoke, humanfriendly, elastic-transport, decorator, colorama, bcrypt, argcomplete, PyNaCl, knack, elasticsearch, azure-cosmos, azure-core, azure-cli-telemetry, paramiko, msrest, azure-storage-common, azure-storage-blob, azure-monitor-query, azure-mgmt-core, azure-keyvault-secrets, azure-keyvault-keys, azure-keyvault-certificates, azure-keyvault-administration, azure-appconfiguration, adal, sshtunnel, scp, PyGithub, msrestazure, msal, fabric, azure-synapse-spark, azure-synapse-managedprivateendpoints, azure-synapse-artifacts, azure-synapse-accesscontrol, azure-storage-file-datalake, azure-multiapi-storage, azure-mgmt-web, azure-mgmt-trafficmanager, azure-mgmt-synapse, azure-mgmt-storage, azure-mgmt-sqlvirtualmachine, azure-mgmt-sql, azure-mgmt-signalr, azure-mgmt-servicelinker, azure-mgmt-servicefabricmanagedclusters, azure-mgmt-servicefabric, azure-mgmt-servicebus, azure-mgmt-security, azure-mgmt-search, azure-mgmt-resource, azure-mgmt-redis, azure-mgmt-redhatopenshift, azure-mgmt-recoveryservicesbackup, azure-mgmt-recoveryservices, azure-mgmt-rdbms, azure-mgmt-privatedns, azure-mgmt-policyinsights, azure-mgmt-netapp, azure-mgmt-msi, azure-mgmt-monitor, azure-mgmt-media, azure-mgmt-marketplaceordering, azure-mgmt-maps, azure-mgmt-managementgroups, azure-mgmt-loganalytics, azure-mgmt-keyvault, azure-mgmt-iothubprovisioningservices, azure-mgmt-iothub, azure-mgmt-iotcentral, azure-mgmt-imagebuilder, azure-mgmt-hdinsight, azure-mgmt-extendedlocation, azure-mgmt-eventhub, azure-mgmt-eventgrid, azure-mgmt-dns, azure-mgmt-datamigration, azure-mgmt-databoxedge, azure-mgmt-cosmosdb, azure-mgmt-containerservice, azure-mgmt-containerregistry, azure-mgmt-containerinstance, azure-mgmt-compute, azure-mgmt-cognitiveservices, azure-mgmt-cdn, azure-mgmt-botservice, azure-mgmt-billing, azure-mgmt-batchai, azure-mgmt-batch, azure-mgmt-authorization, azure-mgmt-applicationinsights, azure-mgmt-appcontainers, azure-mgmt-appconfiguration, azure-mgmt-apimanagement, azure-mgmt-advisor, azure-data-tables, msal-extensions, azure-mgmt-kusto, azure-mgmt-devtestlabs, azure-graphrbac, azure-datalake-store, azure-batch, azure-identity, azure-cli-core, azure-cli\n", + " Attempting uninstall: websocket-client\n", + " Found existing installation: websocket-client 1.8.0\n", + " Uninstalling websocket-client-1.8.0:\n", + " Successfully uninstalled websocket-client-1.8.0\n", + " Attempting uninstall: decorator\n", + " Found existing installation: decorator 4.4.2\n", + " Uninstalling decorator-4.4.2:\n", + " Successfully uninstalled decorator-4.4.2\n", + "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "ipython 7.34.0 requires jedi>=0.16, which is not installed.\n", + "moviepy 1.0.3 requires decorator<5.0,>=4.0.2, but you have decorator 5.1.1 which is incompatible.\u001b[0m\u001b[31m\n", + "\u001b[0mSuccessfully installed PyGithub-1.59.1 PyNaCl-1.5.0 adal-1.2.7 antlr4-python3-runtime-4.13.2 applicationinsights-0.11.10 argcomplete-3.3.0 azure-appconfiguration-1.7.1 azure-batch-14.2.0 azure-cli-2.65.0 azure-cli-core-2.65.0 azure-cli-telemetry-1.1.0 azure-common-1.1.28 azure-core-1.32.0 azure-cosmos-3.2.0 azure-data-tables-12.4.0 azure-datalake-store-0.0.53 azure-graphrbac-0.60.0 azure-identity-1.19.0 azure-keyvault-administration-4.4.0b2 azure-keyvault-certificates-4.7.0 azure-keyvault-keys-4.9.0b3 azure-keyvault-secrets-4.7.0 azure-mgmt-advisor-9.0.0 azure-mgmt-apimanagement-4.0.0 azure-mgmt-appconfiguration-3.0.0 azure-mgmt-appcontainers-2.0.0 azure-mgmt-applicationinsights-1.0.0 azure-mgmt-authorization-4.0.0 azure-mgmt-batch-17.3.0 azure-mgmt-batchai-7.0.0b1 azure-mgmt-billing-6.0.0 azure-mgmt-botservice-2.0.0 azure-mgmt-cdn-12.0.0 azure-mgmt-cognitiveservices-13.5.0 azure-mgmt-compute-33.0.0 azure-mgmt-containerinstance-10.1.0 azure-mgmt-containerregistry-10.3.0 azure-mgmt-containerservice-32.0.0 azure-mgmt-core-1.5.0 azure-mgmt-cosmosdb-9.6.0 azure-mgmt-databoxedge-1.0.0 azure-mgmt-datamigration-10.0.0 azure-mgmt-devtestlabs-4.0.0 azure-mgmt-dns-8.0.0 azure-mgmt-eventgrid-10.2.0b2 azure-mgmt-eventhub-10.1.0 azure-mgmt-extendedlocation-1.0.0b2 azure-mgmt-hdinsight-9.0.0b3 azure-mgmt-imagebuilder-1.3.0 azure-mgmt-iotcentral-10.0.0b2 azure-mgmt-iothub-3.0.0 azure-mgmt-iothubprovisioningservices-1.1.0 azure-mgmt-keyvault-10.3.0 azure-mgmt-kusto-0.3.0 azure-mgmt-loganalytics-13.0.0b4 azure-mgmt-managementgroups-1.0.0 azure-mgmt-maps-2.0.0 azure-mgmt-marketplaceordering-1.1.0 azure-mgmt-media-9.0.0 azure-mgmt-monitor-5.0.1 azure-mgmt-msi-7.0.0 azure-mgmt-netapp-10.1.0 azure-mgmt-policyinsights-1.1.0b4 azure-mgmt-privatedns-1.0.0 azure-mgmt-rdbms-10.2.0b18 azure-mgmt-recoveryservices-3.0.0 azure-mgmt-recoveryservicesbackup-9.1.0 azure-mgmt-redhatopenshift-1.5.0 azure-mgmt-redis-14.4.0 azure-mgmt-resource-23.1.1 azure-mgmt-search-9.1.0 azure-mgmt-security-6.0.0 azure-mgmt-servicebus-8.2.0 azure-mgmt-servicefabric-2.1.0 azure-mgmt-servicefabricmanagedclusters-2.0.0b6 azure-mgmt-servicelinker-1.2.0b2 azure-mgmt-signalr-2.0.0b1 azure-mgmt-sql-4.0.0b19 azure-mgmt-sqlvirtualmachine-1.0.0b5 azure-mgmt-storage-21.2.0 azure-mgmt-synapse-2.1.0b5 azure-mgmt-trafficmanager-1.0.0 azure-mgmt-web-7.2.0 azure-monitor-query-1.2.0 azure-multiapi-storage-1.3.0 azure-storage-blob-12.23.1 azure-storage-common-1.4.2 azure-storage-file-datalake-12.17.0 azure-synapse-accesscontrol-0.5.0 azure-synapse-artifacts-0.19.0 azure-synapse-managedprivateendpoints-0.4.0 azure-synapse-spark-0.2.0 bcrypt-4.2.0 colorama-0.4.6 decorator-5.1.1 elastic-transport-8.15.1 elasticsearch-8.14.0 fabric-3.2.2 humanfriendly-10.0 invoke-2.2.0 isodate-0.7.2 javaproperties-0.5.2 jmespath-1.0.1 jsondiff-2.0.0 knack-0.11.0 microsoft-security-utilities-secret-masker-1.0.0b3 msal-1.31.0 msal-extensions-1.2.0 msrest-0.7.1 msrestazure-0.6.4.post1 paramiko-3.5.0 pkginfo-1.11.2 portalocker-2.10.1 pycomposefile-0.0.32 python-docx-1.1.2 scp-0.13.6 semver-2.13.0 sshtunnel-0.1.5 websocket-client-1.3.3 xmltodict-0.14.2\n" + ] + } + ], + "source": [ + "!python3 -m pip install elasticsearch==8.14 azure-identity azure-storage-file-datalake azure-cli python-docx\n", + "\n", + "import os\n", + "import csv\n", + "import chardet\n", + "\n", + "from docx import Document\n", + "from io import StringIO\n", + "from getpass import getpass\n", + "from google.colab import files\n", + "from elasticsearch import Elasticsearch, exceptions, helpers\n", + "from elasticsearch.helpers import bulk\n", + "from azure.identity import DefaultAzureCredential\n", + "from azure.storage.filedatalake import DataLakeDirectoryClient, DataLakeServiceClient" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Let's sign in with your Microsoft account. At the end of the process, the Google Colab console will display your available subscriptions. Select your subscription by entering the subscription number shown in the console." + ], + "metadata": { + "id": "Ur5tGmKkjtTT" + } + }, + { + "cell_type": "code", + "source": [ + "!az login --allow-no-subscriptions # For no subscriptions login" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "3tLzCaZnKI68", + "outputId": "6303c2a3-2fd5-4e0c-cf22-00e867a9b879" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[91mError loading command module 'mysql': cannot import name 'mysql_flexibleservers' from 'azure.mgmt.rdbms' (/usr/local/lib/python3.10/dist-packages/azure/mgmt/rdbms/__init__.py)\u001b[0m\n", + "\u001b[91mError loading command module 'rdbms': No module named 'azure.mgmt.rdbms.mysql_flexibleservers'\u001b[0m\n", + "\u001b[93mTo sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AYGZ24EJG to authenticate.\u001b[0m\n", + "\n", + "Retrieving tenants and subscriptions for the selection...\n", + "\u001b[93mThe following tenants don't contain accessible subscriptions. Use `az login --allow-no-subscriptions` to have tenant level access.\u001b[0m\n", + "\u001b[93m56783f2b-514d-4ff9-b3ab-3fdc5e7ace5d 'Kibernum'\u001b[0m\n", + "\n", + "[Tenant and subscription selection]\n", + "\n", + "No Subscription name Subscription ID Tenant\n", + "----- ------------------------- ------------------------------------ ------------------------------------\n", + "\u001b[96m[1]\u001b[0m * \u001b[96mN/A(tenant level account)\u001b[0m \u001b[96m56783f2b-514d-4ff9-b3ab-3fdc5e7ace5d\u001b[0m \u001b[96m56783f2b-514d-4ff9-b3ab-3fdc5e7ace5d\u001b[0m\n", + "\n", + "The default is marked with an *; the default tenant is '56783f2b-514d-4ff9-b3ab-3fdc5e7ace5d' and subscription is 'N/A(tenant level account)' (56783f2b-514d-4ff9-b3ab-3fdc5e7ace5d).\n", + "\n", + "Select a subscription and tenant (Type a number or Enter for no changes): 1\n", + "\n", + "Tenant: 56783f2b-514d-4ff9-b3ab-3fdc5e7ace5d\n", + "Subscription: N/A(tenant level account) (56783f2b-514d-4ff9-b3ab-3fdc5e7ace5d)\n", + "\n", + "[Announcements]\n", + "With the new Azure CLI login experience, you can select the subscription you want to use more easily. Learn more about it and its configuration at https://go.microsoft.com/fwlink/?linkid=2271236\n", + "\n", + "If you encounter any problem, please open an issue at https://aka.ms/azclibug\n", + "\n", + "\u001b[93m[Warning] The login output has been updated. Please be aware that it no longer displays the full list of available subscriptions by default.\n", + "\u001b[0m\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Variable Declaration\n", + "\n", + "Necessary variables for the operation of the services we will use. Please, insert your Elasticsearch credentials below:" + ], + "metadata": { + "id": "0IlxbM5skilk" + } + }, + { + "cell_type": "code", + "source": [ + "ELASTIC_CLUSTER_ID = getpass(\"Elastic Cloud ID: \")\n", + "ELASTIC_API_KEY = getpass(\"Elastic Api Key: \")\n", + "\n", + "ONELAKE_ACCOUNT_NAME = \"onelake\"\n", + "ONELAKE_WORKSPACE_NAME = \"ShoesticWorkspace\"\n", + "# Path in format .Lakehouse/files/\n", + "ONELAKE_DATA_PATH = \"shoesticDatalake.Lakehouse/Files/ProductsData\"" + ], + "metadata": { + "id": "zFoRfKBBl6iT", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "0eae3aff-bfd9-442b-ae5a-73fa146c6fc7" + }, + "execution_count": null, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Elastic Cloud ID: ··········\n", + "Elastic Api Key: ··········\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Initialization of OneLake and Elasticsearch Services" + ], + "metadata": { + "id": "w4DGPSxrmb6P" + } + }, + { + "cell_type": "code", + "source": [ + "# Microsoft token\n", + "token_credential = DefaultAzureCredential()\n", + "\n", + "# OneLake services\n", + "service_client = DataLakeServiceClient(\n", + " account_url=f\"https://{ONELAKE_ACCOUNT_NAME}.dfs.fabric.microsoft.com\",\n", + " credential=token_credential,\n", + ")\n", + "file_system_client = service_client.get_file_system_client(ONELAKE_WORKSPACE_NAME)\n", + "directory_client = file_system_client.get_directory_client(ONELAKE_DATA_PATH)\n", + "\n", + "# Elasticsearch client\n", + "es_client = Elasticsearch(\n", + " cloud_id=ELASTIC_CLUSTER_ID,\n", + " api_key=ELASTIC_API_KEY,\n", + ")" + ], + "metadata": { + "id": "rU9db1cJQDS3" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Functions declaration" + ], + "metadata": { + "id": "r1emsb8hmwsb" + } + }, + { + "cell_type": "code", + "source": [ + "# Upload a file to a LakeHouse directory\n", + "def upload_file_to_directory(directory_client, local_path, file_name):\n", + " file_client = directory_client.get_file_client(file_name)\n", + "\n", + " with open(local_path, mode=\"rb\") as data:\n", + " file_client.upload_data(data, overwrite=True)\n", + "\n", + " print(f\"File: {file_name} uploaded to the data lake.\")" + ], + "metadata": { + "id": "dVc_U30vm0L4" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Get directory contents from your lake folder\n", + "def list_directory_contents(file_system_client, directory_name):\n", + " paths = file_system_client.get_paths(path=directory_name)\n", + "\n", + " for path in paths:\n", + " print(path.name + \"\\n\")" + ], + "metadata": { + "id": "LNwweKTAntot" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Get a file by name from your lake folder\n", + "def get_file_by_name(file_name, directory_client):\n", + " return directory_client.get_file_client(file_name)" + ], + "metadata": { + "id": "zBS6j7bVQNcY" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Google Colab saves the files in a internal folder, to prevent the automatic rename of the files, we must to clean de directory\n", + "def clean_directory(directory):\n", + " for filename in os.listdir(directory):\n", + " file_path = os.path.join(directory, filename)\n", + " if os.path.isfile(file_path):\n", + " os.remove(file_path)\n", + " print(f\"File '{filename}' removed successfully.\")" + ], + "metadata": { + "id": "kuW-D3nQ6mX0" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Decode csv\n", + "def get_csv_content(file_client):\n", + " download = file_client.download_file()\n", + " file_content = download.readall()\n", + "\n", + " result = chardet.detect(file_content)\n", + " encoding = result[\"encoding\"]\n", + "\n", + " return file_content.decode(encoding)" + ], + "metadata": { + "id": "eGLBygpK9YTK" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Decode docx\n", + "def get_docx_content(file_client):\n", + " download = file_client.download_file()\n", + " file_content = download.readall()\n", + "\n", + " temp_file_path = \"temp.docx\"\n", + " with open(temp_file_path, \"wb\") as temp_file:\n", + " temp_file.write(file_content)\n", + "\n", + " doc = Document(temp_file_path)\n", + " text = []\n", + " for paragraph in doc.paragraphs:\n", + " text.append(paragraph.text)\n", + "\n", + " return \"\\n\".join(text)" + ], + "metadata": { + "id": "FelmeP4l8hQP" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Uploading data to OneLake" + ], + "metadata": { + "id": "G7U09Dd3_fy7" + } + }, + { + "cell_type": "markdown", + "source": [ + "Before start to upload your files is higlhy recommended to clean the Google Colab directory." + ], + "metadata": { + "id": "luDALXfWCBQI" + } + }, + { + "cell_type": "code", + "source": [ + "clean_directory(\"/content\")" + ], + "metadata": { + "id": "tEi6Ls4qB_OZ" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "Upload the csv file:" + ], + "metadata": { + "id": "yQizi7s_CKQw" + } + }, + { + "cell_type": "code", + "source": [ + "# Upload csv to Colab\n", + "\n", + "# Upload one local file\n", + "uploaded = files.upload()\n", + "csv_file_name = list(uploaded.keys())[0]\n", + "\n", + "# Google Colab file path\n", + "csv_local_path = f\"/content/{csv_file_name}\"" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 72 + }, + "id": "K0BWR3VitW1n", + "outputId": "75bbe968-0ed8-4e58-d18e-7b14bef7a0d4" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " Upload widget is only available when the cell has been executed in the\n", + " current browser session. Please rerun this cell to enable.\n", + " \n", + " " + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Saving products.csv to products.csv\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Upload the 3 docx files:" + ], + "metadata": { + "id": "VgoWeLuU1rPJ" + } + }, + { + "cell_type": "code", + "source": [ + "# Upload docx files to Colab\n", + "\n", + "uploaded = files.upload()\n", + "docx_files = list(uploaded.keys())\n", + "\n", + "docx_local_paths = [f\"/content/{file_name}\" for file_name in docx_files]" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 195 + }, + "id": "KKNC_8t8BiTX", + "outputId": "7bfb2715-b18f-49e3-fe81-72e78e24531f" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " Upload widget is only available when the cell has been executed in the\n", + " current browser session. Please rerun this cell to enable.\n", + " \n", + " " + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Saving sport-sneakers.docx to sport-sneakers.docx\n", + "Saving classic-loafers.docx to classic-loafers.docx\n", + "Saving beach-flip-flops.docx to beach-flip-flops.docx\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Upload files to Lakehouse\n", + "upload_file_to_directory(directory_client, csv_local_path, csv_file_name)\n", + "\n", + "for docx_local_path in docx_local_paths:\n", + " docx_file_name = docx_local_path.split(\"/\")[-1]\n", + " upload_file_to_directory(directory_client, docx_local_path, docx_file_name)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "9u8tte8fuR6o", + "outputId": "b13c059d-7452-4229-e346-080ed9d8b5f5" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "File: products.csv uploaded to the data lake.\n", + "File: sport-sneakers.docx uploaded to the data lake.\n", + "File: classic-loafers.docx uploaded to the data lake.\n", + "File: beach-flip-flops.docx uploaded to the data lake.\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Check if files are now available in your datalake." + ], + "metadata": { + "id": "a4tkLjo6A6yt" + } + }, + { + "cell_type": "code", + "source": [ + "list_directory_contents(file_system_client, ONELAKE_DATA_PATH)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "IipcuVFBGfbD", + "outputId": "87cf4b1f-7bf7-4671-c12e-da221511b2dd" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "shoesticDatalake.Lakehouse/Files/ProductsData/beach-flip-flops.docx\n", + "\n", + "shoesticDatalake.Lakehouse/Files/ProductsData/classic-loafers.docx\n", + "\n", + "shoesticDatalake.Lakehouse/Files/ProductsData/products.csv\n", + "\n", + "shoesticDatalake.Lakehouse/Files/ProductsData/sport-sneakers.docx\n", + "\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Indexing data to Elasticsearch" + ], + "metadata": { + "id": "oTkmZC1w_qa7" + } + }, + { + "cell_type": "markdown", + "source": [ + "## Creating embeddings endpoint" + ], + "metadata": { + "id": "LcRrrOwNZLWz" + } + }, + { + "cell_type": "code", + "source": [ + "try:\n", + " es_client.options(\n", + " request_timeout=60, max_retries=3, retry_on_timeout=True\n", + " ).inference.put_model(\n", + " inference_id=\"onelake-inference-endpoint\",\n", + " body={\n", + " \"task_type\": \"sparse_embedding\",\n", + " \"service\": \"elser\",\n", + " \"service_settings\": {\n", + " \"model_id\": \".elser_model_2_linux-x86_64\",\n", + " \"num_allocations\": 1,\n", + " \"num_threads\": 1,\n", + " },\n", + " },\n", + " )\n", + "\n", + " print(\"Embedding endpoint created successfully.\")\n", + "except exceptions.BadRequestError as e:\n", + " raise e" + ], + "metadata": { + "id": "QFLH_4v6ZIM7", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "38f70e08-c7cb-4e82-dc1f-6076b9fb1802" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Embedding endpoint created successfully.\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Creating Mappings" + ], + "metadata": { + "id": "s6ko5zhJZgKD" + } + }, + { + "cell_type": "code", + "source": [ + "# For data in csv\n", + "try:\n", + " es_client.indices.create(\n", + " index=\"shoestic-products\",\n", + " body={\n", + " \"mappings\": {\n", + " \"properties\": {\n", + " \"product_id\": {\"type\": \"keyword\"},\n", + " \"product_name\": {\"type\": \"text\"},\n", + " \"amount\": {\"type\": \"float\"},\n", + " \"tags\": {\"type\": \"keyword\"},\n", + " }\n", + " }\n", + " },\n", + " )\n", + "except exceptions.RequestError as e:\n", + " if e.error == \"resource_already_exists_exception\":\n", + " print(\"Index already exists.\")\n", + " else:\n", + " raise e" + ], + "metadata": { + "id": "DG9Zi1LdZeUd" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# For data in docx\n", + "try:\n", + " es_client.indices.create(\n", + " index=\"shoestic-products-descriptions\",\n", + " body={\n", + " \"mappings\": {\n", + " \"properties\": {\n", + " \"title\": {\"type\": \"text\", \"analyzer\": \"english\"},\n", + " \"super_body\": {\n", + " \"type\": \"semantic_text\",\n", + " \"inference_id\": \"onelake-inference-endpoint\",\n", + " },\n", + " \"body\": {\"type\": \"text\", \"copy_to\": \"super_body\"},\n", + " }\n", + " }\n", + " },\n", + " )\n", + "except exceptions.RequestError as e:\n", + " if e.error == \"resource_already_exists_exception\":\n", + " print(\"Index already exists.\")\n", + " else:\n", + " raise e" + ], + "metadata": { + "id": "G7k6YiQehzBf" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Indexing data" + ], + "metadata": { + "id": "HOkYO6LtZkQC" + } + }, + { + "cell_type": "markdown", + "source": [ + "### Retrieving documents from OneLake" + ], + "metadata": { + "id": "LDyqhYao9gpQ" + } + }, + { + "cell_type": "code", + "source": [ + "# Getting files from Lakehouse\n", + "csv_file_client = get_file_by_name(\"products.csv\", directory_client)\n", + "\n", + "docx_files_clients = []\n", + "\n", + "for docx_file_name in docx_files:\n", + " docx_files_clients.append(get_file_by_name(docx_file_name, directory_client))" + ], + "metadata": { + "id": "vTIsi_THo8ws" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "### Extract content" + ], + "metadata": { + "id": "wjPw7wxHZ_w0" + } + }, + { + "cell_type": "code", + "source": [ + "csv_content = get_csv_content(csv_file_client)\n", + "reader = csv.DictReader(StringIO(csv_content))\n", + "\n", + "docx_contents = []\n", + "\n", + "for docx_file_client in docx_files_clients:\n", + " docx_contents.append(get_docx_content(docx_file_client))\n", + "\n", + "print(\"CSV FILE CONTENT: \", csv_content)\n", + "print(\"DOCX FILE CONTENT: \", docx_contents)" + ], + "metadata": { + "id": "WrvwaqZ4_t5U", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "27241c26-0725-494f-96d0-97383327a334" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "CSV FILE CONTENT: product_id,product_name,amount,tags\n", + "P-115,Classic Loafers,19.69,\"classic,formal\"\n", + "P-114,Sport Sneakers,156.18,\"sport,casual\"\n", + "P-109,Ankle Boots,87.13,\"boots,winter\"\n", + "P-118,Casual Sandals,128.22,\"casual,summer\"\n", + "P-112,Running Shoes,132.27,\"sport,running\"\n", + "P-116,Leather Sandals,107.63,\"leather,casual\"\n", + "P-105,Canvas Sneakers,75.56,\"casual,sneakers\"\n", + "P-107,Winter Boots,49.57,\"winter,outdoor\"\n", + "P-111,Formal Oxfords,177.70,\"formal,classic\"\n", + "P-119,Beach Flip-Flops,50.64,\"beach,summer\"\n", + "\n", + "DOCX FILE CONTENT: ['Crafted for an active lifestyle, this footwear offers excellent support and durability, featuring a non-slip sole that’s perfect for both workouts and casual use.', 'With a timeless design, this elegant choice pairs well with professional and social attire. Made from high-quality leather, it adds a touch of sophistication.', 'Ideal for warm, sunny days by the water, these lightweight essentials are water-resistant and come in bright colors, bringing a laid-back vibe to any outing in the sun.']\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# The tags must be an array\n", + "rows = csv_content.splitlines()\n", + "reader = csv.DictReader(rows)\n", + "\n", + "modified_rows = []\n", + "\n", + "for row in reader:\n", + " row[\"tags\"] = row[\"tags\"].replace('\"', \"\").split(\",\")\n", + " modified_rows.append(row)\n", + "\n", + " print(row[\"tags\"])\n", + "\n", + "reader = modified_rows" + ], + "metadata": { + "id": "vp7skddC_VIJ", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "2608ddcf-cf4a-4681-eb53-101e21dd6a51" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "['classic', 'formal']\n", + "['sport', 'casual']\n", + "['boots', 'winter']\n", + "['casual', 'summer']\n", + "['sport', 'running']\n", + "['leather', 'casual']\n", + "['casual', 'sneakers']\n", + "['winter', 'outdoor']\n", + "['formal', 'classic']\n", + "['beach', 'summer']\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Indexing data" + ], + "metadata": { + "id": "qeWE60zy-MQs" + } + }, + { + "cell_type": "code", + "source": [ + "csv_actions = [{\"_index\": \"shoestic-products\", \"_source\": row} for row in reader]\n", + "\n", + "docx_actions = [\n", + " {\n", + " \"_index\": \"shoestic-products-descriptions\",\n", + " \"_source\": {\"title\": docx_file_name, \"body\": docx},\n", + " }\n", + " for docx_file_name, docx in zip(docx_files, docx_contents)\n", + "]\n", + "\n", + "\n", + "helpers.bulk(es_client, csv_actions)\n", + "print(\"CSV data indexed successfully.\")\n", + "helpers.bulk(es_client, docx_actions)\n", + "print(\"DOCX data indexed successfully.\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "WfIyoWoD-Rsv", + "outputId": "25732e05-c048-4a2a-86dd-1561e8c21872" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "CSV data indexed successfully.\n", + "DOCX data indexed successfully.\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Retrieving data from Elasticsearch" + ], + "metadata": { + "id": "HrPYKMxf-IV8" + } + }, + { + "cell_type": "markdown", + "source": [ + "Semantic search: let's search for the word 'summer' and see what results the search returns." + ], + "metadata": { + "id": "r1Q0oyFLpgDN" + } + }, + { + "cell_type": "code", + "source": [ + "response = es_client.search(\n", + " index=\"shoestic-products-descriptions\",\n", + " body={\n", + " \"size\": 1,\n", + " \"_source\": {\"excludes\": [\"*embeddings\", \"*chunks\"]},\n", + " \"query\": {\"semantic\": {\"field\": \"super_body\", \"query\": \"summer\"}},\n", + " },\n", + ")\n", + "\n", + "print(response[\"hits\"][\"hits\"][0][\"_source\"][\"body\"])" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Ij4Vqbq1o23q", + "outputId": "60b940f5-fcaa-496c-c77a-309e3564cfe0" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Ideal for warm, sunny days by the water, these lightweight essentials are water-resistant and come in bright colors, bringing a laid-back vibe to any outing in the sun.\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Now let's search for the same word in the product tags using a full-text search. Both responses are related." + ], + "metadata": { + "id": "wabN70Ixq9tA" + } + }, + { + "cell_type": "code", + "source": [ + "response = es_client.search(\n", + " index=\"shoestic-products\", body={\"size\": 1, \"query\": {\"term\": {\"tags\": \"summer\"}}}\n", + ")\n", + "\n", + "print(response[\"hits\"][\"hits\"][0][\"_source\"])" + ], + "metadata": { + "id": "wE8mg2IaZ5sg", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "f5aa9781-ace4-44e7-d6b8-8d7fe9c6ae70" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "{'product_id': 'P-118', 'product_name': 'Casual Sandals', 'amount': '128.22', 'tags': ['casual', 'summer']}\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Cleanup\n", + "\n", + "Finally, we can delete the resources used to prevent them from consuming resources." + ], + "metadata": { + "id": "UJrHLf3QaI2c" + } + }, + { + "cell_type": "code", + "source": [ + "# Cleanup - Delete Index\n", + "es_client.indices.delete(index=\"shoestic-products\", ignore=[400, 404])\n", + "es_client.indices.delete(index=\"shoestic-products-descriptions\", ignore=[400, 404])\n", + "\n", + "# Cleanup - Delete Embeddings Endpoint\n", + "es_client.inference.delete_model(\n", + " inference_id=\"onelake-inference-endpoint\", ignore=[400, 404]\n", + ")" + ], + "metadata": { + "id": "LaCgcAEjaFmV", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "0b661e96-908d-4c55-b7a8-87244f39ab22" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + ":2: DeprecationWarning: Passing transport options in the API method is deprecated. Use 'Elasticsearch.options()' instead.\n", + " es_client.indices.delete(index=\"shoestic-products\", ignore=[400, 404])\n", + ":3: DeprecationWarning: Passing transport options in the API method is deprecated. Use 'Elasticsearch.options()' instead.\n", + " es_client.indices.delete(index=\"shoestic-products-descriptions\", ignore=[400, 404])\n", + ":6: DeprecationWarning: Passing transport options in the API method is deprecated. Use 'Elasticsearch.options()' instead.\n", + " es_client.inference.delete_model(inference_id=\"onelake-inference-endpoint\", ignore=[400, 404])\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "ObjectApiResponse({'acknowledged': True, 'pipelines': []})" + ] + }, + "metadata": {}, + "execution_count": 16 + } + ] + } + ] +} \ No newline at end of file From edd067f30fbc56d741c70cd5bd29926b65d42c65 Mon Sep 17 00:00:00 2001 From: llermaly Date: Sat, 2 Nov 2024 18:41:03 -0500 Subject: [PATCH 2/2] adding onelake products --- .../onelake_products.zip | Bin 0 -> 66077 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 supporting-blog-content/ingesting-data-with-onelake-part-i/onelake_products.zip diff --git a/supporting-blog-content/ingesting-data-with-onelake-part-i/onelake_products.zip b/supporting-blog-content/ingesting-data-with-onelake-part-i/onelake_products.zip new file mode 100644 index 0000000000000000000000000000000000000000..6d04910635091e9cbf16cde2b659bbe167960d20 GIT binary patch literal 66077 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 H0tp5HmiYD@ literal 0 HcmV?d00001