我是Azure和Python的新手,正在用数据块创建一个笔记本来输出一段sql的结果。下面的代码产生预期的输出,但是默认文件名长约100个字符。我希望能够给输出一个合理的名称,并添加一个日期/时间来创建唯一性,例如testfile20191001142340.csv。我已经忙得不可开交,找不到任何有帮助的东西,希望社区中的某人可以为我指明正确的方向
%python
try:
dfsql = spark.sql("select * from dbsmets1mig02_technical_build.tbl_Temp_Output_CS_Firmware_Final order by record1") #Replace with your SQL
except:
print("Exception occurred")
if dfsql.count() == 0:
print("No data rows")
else:
dfsql.coalesce(1).write.format("com.databricks.spark.csv").option("header","false").option("delimiter","|").mode("overwrite").option("quote","\u0000").save(
"/mnt/publisheddatasmets1mig/metering/smets1mig/cs/system_data_build/firmware/outbound/")
答案 0 :(得分:0)
命名单个文件的问题在于,这几乎与spark的原理背道而驰。为了实现快速处理,Spark必须能够并行执行写入。对于自然支持parallelizm的镶木地板文件或其他输出,这不是问题。对于.csv文件,我们习惯于处理单个文件,因此会造成很多混乱。
长话短说,如果您不使用.coalesce(1)
,Spark会将您的数据写入一个文件夹中的多个.csv文件。由于只有一个分区,因此只有一个文件-但具有生成的名称。因此,您有两种选择:
csv
包)您可能会遇到的一个显而易见的问题是,为什么要做一件像保存到单个文件这样简单的事情如此困难-答案是,因为这是Spark的问题。保存单个分区的方法的问题在于,如果您的数据量超出了驱动程序/执行程序内存的容量,则重新分区为1个分区或collect
将数据提供给执行程序将完全失败并爆炸。一个例外。
为了安全地保存到单个.csv文件,您可以使用toLocalIterator
方法,该方法一次仅将一个分区加载到内存中,并且在其迭代器中使用csv
package将结果保存到单个文件中。