PySpark:将临时视图转换为表格并在本地驱动器中另存为 .CSV

Posted

技术标签:

【中文标题】PySpark:将临时视图转换为表格并在本地驱动器中另存为 .CSV【英文标题】:PySpark: Converting a Temporary View to a Table and save as .CSV in local drive 【发布时间】:2019-04-01 05:47:10 【问题描述】:

我正在 PySpark 2.4 中创建 JDBC 查询的临时视图。我的数据源是MS SQL Server 2017

df = spark.read.format("jdbc").options(url="url",properties =  "driver": "com.microsoft.sqlserver.jdbc.SQLServerDriver" ,dbtable="dbtable").load()
df.createOrReplaceTempView("df_temp")

现在我可以查询临时创建的表

df_new = spark.sql("select * from df_temp where ...#standard query")

现在我想将上面的df_new 写为CSV 在我的本地驱动器中。一种方法(目前我正在做同样的事情)是转换 df_new.toPandas()。然后将其保存为csv(标准df.to_csv('/path/file.csv' 方法)。此方法创建一个名为file.csv 的文件夹,并在此文件夹中生成一个名称以part-00000-fd4c62bd-f208-4bd3-ae99-f81338b9ede1-c000.csv 开头的csv 文件。

所以如果我每天运行我的.py 文件(使用像crontab 这样的调度程序),这绝对不是一个好的选择。

问题:

    如何标准化 .csv 文件的名称,并且可以每天将新数据附加到同一文件中?

    有什么简单的方法可以将df_new 转换为表格或Spark DataFrame。这样我就可以申请df.coalesce(1).option("header","true").csv('/path/myfile.csv')

【问题讨论】:

df_new 是一个数据框,因此您可以执行coalesce(1) 并保存到本地路径。 我收到错误,因为“NoneObject 没有属性写入”。 @pythondumb,您只能指定要将文件写入的文件夹名称。您无法控制正在创建的 json 文件的名称。参考这个链接,***.com/questions/41990086/… @Gladiator:假设我使用 python 等效技术(如此处所述,***.com/questions/48652050/… 这种情况下如何每天将新数据附加到同一个文件? 我不确定你为什么要拥有单个文件,因为它会影响并行性而不是最佳实践。但是,有很多技巧。您可以尝试,1. 将所有当前数据移动到临时位置 2. 读取此临时位置并合并(1)并写入目标 【参考方案1】:

使用它来保存到本地文件系统

    #for Output in multiple files:
    df.write.option("header", "true").csv("/path/output.csv")

    #for output in single file:
    df.coalesce(1).write.option("header", "true").csv("/path/output.csv")

【讨论】:

以上是关于PySpark:将临时视图转换为表格并在本地驱动器中另存为 .CSV的主要内容,如果未能解决你的问题,请参考以下文章

Swift Parse - 本地数据存储并在表格视图中显示对象

pyspark:将稀疏局部矩阵转换为 RDD

如何在pyspark sql中保存表?

如何从转义闭包中获取值并将其分配给变量并在表格视图中显示

甲骨文临时存储

为啥在 pyspark 中加入两个临时视图后删除列不起作用,但它适用于数据框连接?