Как переименовать мой JSON, сгенерированный pyspark? - PullRequest
0 голосов
/ 30 сентября 2019

Когда я пишу свой файл JSON с помощью

dataframe.coalesce(1).write.format('json')

на pyspark, я не могу изменить имя файла в разделе

Я пишу свой JSON так:

dataframe.coalesce(1).write.format('json').mode('overwrite').save('path')

но я не могу изменить имя файла в разделе

Я хочу такой путь:

/ folder / my_name.json

гдеmy_name.json - это файл json

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

В искре we can't control name of the file записано в каталог.

Сначала запишите данные в HDFS directory, затем Для изменения имени файла нам нужноиспользуйте HDFS api.

Example:

In Pyspark:

l=[("a",1)]
ll=["id","sa"]
df=spark.createDataFrame(l,ll)

hdfs_dir = "/folder/" #your hdfs directory
new_filename="my_name.json" #new filename

df.coalesce(1).write.format("json").mode("overwrite").save(hdfs_dir)

fs = spark._jvm.org.apache.hadoop.fs.FileSystem.get(spark._jsc.hadoopConfiguration())

#list files in the directory

list_status = fs.listStatus(spark._jvm.org.apache.hadoop.fs.Path(hdfs_dir))

#filter name of the file starts with part-

file_name = [file.getPath().getName() for file in list_status if file.getPath().getName().startswith('part-')][0]

#rename the file

fs.rename(Path(hdfs_dir+''+file_name),Path(hdfs_dir+''+new_filename))

Если вы хотите удалить success files в каталоге, используйте fs.delete для удаления _Success файлов.

In Scala:

val df=Seq(("a",1)).toDF("id","sa")
df.show(false)

import org.apache.hadoop.fs._

val hdfs_dir = "/folder/"
val new_filename="new_json.json"

df.coalesce(1).write.mode("overwrite").format("json").save(hdfs_dir)

val fs=FileSystem.get(sc.hadoopConfiguration)
val f=fs.globStatus(new Path(s"${hdfs_dir}" + "*")).filter(x => x.getPath.getName.toString.startsWith("part-")).map(x => x.getPath.getName).mkString

fs.rename(new Path(s"${hdfs_dir}${f}"),new Path(s"${hdfs_dir}${new_filename}"))

fs.delete(new Path(s"${hdfs_dir}" + "_SUCCESS"))
0 голосов
/ 30 сентября 2019
dataframe.coalesce(1).write.format('json').mode('overwrite').save('/path/file_name')

Это создаст папку с именем_файла. Отметив эту папку, вы можете получить один файл со всей частью данных-000.

В Spark данные распределяются по нескольким узлам, вычисления выполняются параллельно, а окончательные данные частично отправляются в каталог. Чем больше размер файла, тем больше будет «частичных» файлов. Так что невозможно записать в один файл. В случае одиночной части-00 вы можете переименовать файл после завершения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...