Блоки данных Azure для записи файла в Azure Data Lake Gen 2 - PullRequest
0 голосов
/ 05 мая 2019

У меня есть Azure Data Lake gen1 и Azure Data Lake gen2 (хранилище BLOB-объектов с иерархической структурой), и я пытаюсь создать записную книжку Databricks (Scala), которая считывает 2 файла и записывает новый файл обратно в Data Lake. И в Gen1, и в Gen2 я испытываю одну и ту же проблему, когда указанное имя выходного файла csv сохраняется как каталог, и внутри этого каталога записывается 4 файла " commit , началось , _SUCCESS и part-00000-tid-

databricks output screenshot

Что касается жизни, я не могу понять, почему он это делает, а на самом деле не сохраняет CSV-файл в этом месте. Вот пример кода, который я написал. Если я сделаю .show () на фрейме данных df_join, он выдаст правильные результаты. Но .write не работает правильно.

val df_names = spark.read.option("header", "true").csv("/mnt/datalake/raw/names.csv")
val df_addresses = spark.read.option("header", "true").csv("/mnt/datalake/raw/addresses.csv")

val df_join = df_names.join(df_addresses, df_names.col("pk") === df_addresses.col("namepk"))


df_join.write
.format("com.databricks.spark.csv")
.option("header", "true")
.mode("overwrite")
.save("/mnt/datalake/reports/testoutput.csv")

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Если я правильно понимаю, что вам нужно, вы просто хотите записать данные Spark DataFrame в один файл CSV с именем testoutput.csv в озеро данных Azure, а не в каталог с именем testoutput.csv с некоторыми файлами разделов.

Таким образом, вы не можете напрямую реализовать это, используя такие функции Spark, как DataFrameWriter.save, потому что на самом деле программа записи данных записывает данные в HDFS на основе Azure Data Lake.HDFS сохраняет данные в виде каталога с именем yours и некоторыми файлами разделов.Пожалуйста, ознакомьтесь с некоторыми документами о HDFS, такими как The Hadoop FileSystem API Definition.

Затем, по моему опыту, вы можете попробовать использовать Azure Data Lake SDK для Jave в вашей программе Scala для прямой записи.данные из DataFrame в Azure Data Lake в виде одного файла.И вы можете обратиться к некоторым образцам https://github.com/Azure-Samples?utf8=%E2%9C%93&q=data-lake&type=&language=java.

0 голосов
/ 06 мая 2019

Причина, по которой он создает каталог с несколькими файлами, заключается в том, что каждый раздел сохраняется и записывается в озеро данных отдельно. Чтобы сохранить один выходной файл, вам нужно переразметить ваш фрейм данных

Давайте использовать API данных

confKey = "fs.azure.account.key.srcAcctName.blob.core.windows.net"
secretKey = "==" #your secret key
spark.conf.set(confKey,secretKey)
blobUrl = 'wasbs://MyContainerName@srcAcctName.blob.core.windows.net'

Объединить ваш фрейм данных

df_join.coalesce(1)
.write
.format("com.databricks.spark.csv")
.option("header", "true")
.mode("overwrite")
.save("blobUrl" + "/reports/")

Изменить имя файла

files = dbutils.fs.ls(blobUrl + '/reports/')
output_file = [x for x in files if x.name.startswith("part-")]
dbutils.fs.mv(output_file[0].path, "%s/reports/testoutput.csv" % (blobUrl))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...