Я очень новичок в Azure, мне нужно знать, как лучше всего передать фреймворк данных pandas размером около 10 ГБ на сервер sql и какие службы лучше обрабатывать 10-13 ГБ данных. В настоящее время я использую функцию Python Azure, где я делаю некоторые ETL, и, наконец, чистые данные размером 10 ГБ должны быть отправлены на сервер sql?
Меня смущают следующие моменты
Лучше ли Azure Databricks, чем функция Azure, с точки зрения времени и стоимости для обработки данных объемом 10–15 ГБ?
Для передачи данных, какой метод лучше:
Отправка с python с помощью: df.to_sql('products', conn, if_exists='replace', index = False)
или с использованием действия копирования ADF? -- Любые другие предложения приветствуются.
Должен ли я выбрать PySpark вместо Python в блоке данных Azure, чтобы ускорить процесс?
Как упоминалось в некоторых комментариях, быстрее загружать данные в SQL с помощью Pyspark.
Код для загрузки кадра данных pyspark в SQL
from datetime import datetime
servername = "jdbc:sqlserver://mytestserver.database.windows.net:1433"
dbname = "mydbname"
url = servername + ";" + "databaseName = " + dbname + ";"
dbtable = "Mytable"
user = "xxxxxxx"
password = "xxxxxxxxxxxxx" # Please specify password here
def writeToSQL(df_raw):
# Adding an id column with unique values
uuidUdf= udf(lambda : str(uuid.uuid4()),StringType())
nowUdf= udf(lambda : int(time.time() * 1000),LongType())
df_raw = df1 \
.withColumn("id", uuidUdf()) \
.withColumn("insertedAt", nowUdf()) \
try:
df_raw.write \
.format("com.microsoft.sqlserver.jdbc.spark") \
.mode("overwrite") \
.option("url", url) \
.option("dbtable", dbtable) \
.option("user", user) \
.option("password", password) \
.save()
except ValueError as error :
print("Connector write failed", error)
df_raw=spark.createDataFrame(pandasDF) #convert pandas to pyspark
starttime = datetime.utcnow()
print("Starting ingestion: ", datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S.%f"))
writeToSQL(df_raw)
endtime = datetime.utcnow()
print("Finished ingestion: ", datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S.%f"))
print("Time taken :" + str(endtime-starttime))
В этой строке df_raw=spark.createDataFrame(pandasDF) #convert pandas to pyspark... Вы конвертируете фрейм данных pandas в Pyspark, а затем отправляете данные в SQL. Мой вопрос: вы запустили все свои etl в Python и во время нажатия вы только что преобразовали pandas df в pyspark df?
Ну да. Фрейм данных Python не предлагает производительность, которую делает pyspark. Конечно, вы можете напрямую загрузить фрейм данных pandas (используя другой код), но это займет много времени. Чтобы загрузить данные в SQL с помощью pyspark, вам нужен фрейм данных pyspark. Вы сказали, что в настоящее время используете Python, но ваш вопрос заключался в том, что быстрее. Pyspark является здесь явным победителем с точки зрения производительности, и использование Python на блоках данных — пустая трата времени, когда Databricks предлагает искру. Если возможно, вам следует изменить текущий ETL на Pyspark.
Если вы используете Databricks, вам также следует использовать PySpark вместо pandas, поскольку PySpark использует для обработки узлы кластера, а pandas, насколько я знаю, этого не делает.