Apache spark Databricks-创建输出文件
我对databricks很陌生,请原谅我的无知。 我有一个DataRicks笔记本,可以创建一个表来保存数据。我试图使用另一个使用python的笔记本将数据输出到管道分隔的文件中。如果我使用'Order By'子句,则每个记录都在一个单独的文件中创建。如果我把这个子句从代码中去掉,我会得到一个文件,但它不符合顺序 笔记本上的代码如下Apache spark Databricks-创建输出文件,apache-spark,databricks,Apache Spark,Databricks,我对databricks很陌生,请原谅我的无知。 我有一个DataRicks笔记本,可以创建一个表来保存数据。我试图使用另一个使用python的笔记本将数据输出到管道分隔的文件中。如果我使用'Order By'子句,则每个记录都在一个单独的文件中创建。如果我把这个子句从代码中去掉,我会得到一个文件,但它不符合顺序 笔记本上的代码如下 %python try: dfsql = spark.sql("select field_1, field_2, field_3, field_4, fie
%python
try:
dfsql = spark.sql("select field_1, field_2, field_3, field_4, field_5, field_6, field_7, field_8, field_9, field_10, field_11, field_12, field_13, field_14, field_15, field_16 from dbsmets1mig02_technical_build.tbl_tech_output_bsmart_update ORDER BY MSN,Sort_Order") #Replace with your SQL
except:
print("Exception occurred")
if dfsql.count() == 0:
print("No data rows")
else:
dfsql.write.format("com.databricks.spark.csv").option("header","false").option("delimiter", "|").mode("overwrite").save("/mnt/publisheddatasmets1mig/smetsmig1/mmt/bsmart")
Spark在写入文件时为每个分区创建一个文件。因此,您的order by正在创建许多分区。通常,您需要多个文件,因为这意味着您可以获得更高的吞吐量-如果您有一个文件/分区,那么您只使用一个线程-因此您的工作线程上只有一个CPU处于活动状态-其他CPU处于空闲状态,这使得解决问题的成本非常高 您可以在中保留顺序并合并回单个分区:
dfsql.coalesce(1).write.format("com.databricks.spark.csv").option("header","false").option("delimiter", "|").mode("overwrite").save("/mnt/publisheddatasmets1mig/smetsmig1/mmt/bsmart")
即使您有多个文件,您也可以将其他笔记本指向该文件夹,它将读取该文件夹中的所有文件。为了实现这一点,我做了一些类似于simon_dmorias建议的事情。我不确定是否有更好的方法可以做到这一点,因为这不能很好地扩展,但如果您使用的是一个小数据集,它将起作用 simon_dmorias建议:
df.coalesce(1).write.format(“com.databricks.spark.csv”).option(“header”、“false”).option(“delimiter”、“delimiter”).mode(“overwrite”).save(“/mnt/mountone/data/”)
这将在目录
/mnt/mountone/data/data--.csv
中写入一个分区,我相信这不是您想要的,对吗?您只需要/mnt/mountone/data.csv
,类似于pandas.to_csv
函数
因此,我将把它写到集群上的一个临时位置(而不是挂载上)
df.coalesce(1).write.format(“com.databricks.spark.csv”).option(“header”,“false”).option(“delimiter”,“|”).mode(“overwrite”).save(“/tmpdir/data”)
然后,我将使用dbutils.fs.ls(“/tmpdir/data”)
命令列出目录内容并标识写入目录的csv文件的名称,即/tmpdir/data/data--.csv
获得CSV文件名后,我将使用dbutils.fs.cp
函数将文件复制到装载位置并重命名文件。这允许您拥有一个没有目录的单一文件,我相信您正在寻找目录
dbutils.fs.cp(“/tmpdir/data/data--.csv”,“/mnt/mountone/data.csv”)
Simon现在创建了一个输出文件,这正是我需要的,许多感谢者,响应太快了。我得到了1个文件,但在每条记录的末尾没有换行符。有什么想法吗?