Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Databricks-创建输出文件_Apache Spark_Databricks - Fatal编程技术网

Apache spark Databricks-创建输出文件

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

我对databricks很陌生,请原谅我的无知。 我有一个DataRicks笔记本,可以创建一个表来保存数据。我试图使用另一个使用python的笔记本将数据输出到管道分隔的文件中。如果我使用'Order By'子句,则每个记录都在一个单独的文件中创建。如果我把这个子句从代码中去掉,我会得到一个文件,但它不符合顺序

笔记本上的代码如下

%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个文件,但在每条记录的末尾没有换行符。有什么想法吗?