【问题标题】:Errors when trying to save parquet file to a CSV using to_csv尝试使用 to_csv 将镶木地板文件保存到 CSV 时出错
【发布时间】:2018-02-03 07:22:49
【问题描述】:

我正在尝试读取其中包含一些实验室数据的 parquet 文件,然后将其加载到临时表中,对该表进行查询,然后将结果保存到 CSV 文件中,其中列和逗号分隔。这是我的代码:

lines = sqlContext.read.parquet("hdfs:////data/lab_01/")
lines.registerTempTable("test_data")
resultsDF = sqlContext.sql("select * from results")

header = ["lab_key", "tray_id", "time", "gene_id", "source"]
pandas.resultsDF.to_csv("/data/results.csv", sep=",", columns = header)

我得到的错误是这样的,它在代码的最后一行:

AttributeError: 模块 'pandas' 没有属性 'resultsDF'

我正在寻找带有标题的 CSV 文件,如下所示:

lab_key  tray_id   time   gene_id  Source
10       26905972   1     8315     2        
30       26984972   1     8669     2        
30       26949059   1     1023     2        
30      26905972    1     1062     1    

这是我的数据框 resultsDF 的样子:

[Row(lab_key=1130, tray_id=26984905972, time=1, gene_id=833715, source=2),
 Row(lab_key=1130, tray_id=26984905972, time=1, gene_id=866950, source=2),
 Row(lab_key=1130, tray_id=26984905972, time=1, gene_id=1022843, source=2),

【问题讨论】:

  • 删除熊猫。 resultsDF.to_csv("/data/results.csv", sep=",", columns = header)
  • 执行此操作时出现错误:AttributeError: 'DataFrame' object has no attribute 'to_csv'

标签: python pandas csv pyspark


【解决方案1】:

要回答这个问题:您需要像这样转换为 Pandas 并转换为 csv

resultsDF.toPandas().to_csv(" ")

这是一个不好的方法,因为如果只需要保存为csv,则无需转换为Pandas DataFrame,您应该使用以下方法

resultsDF.repartition(1).write.format('com.databricks.spark.csv').save('path+my.csv',header = 'true')

【讨论】:

  • 谢谢,我不确定 Pandas,但这个解决方案有效。标题也在那里。
  • 你能告诉我为什么是 'com.databricks.spark.csv' 吗?那是为了什么?
【解决方案2】:

您有 Spark 数据框,您需要先将其转换为 pandas。

import pandas as pd

lines = sqlContext.read.parquet("hdfs:////data/lab_01/")
lines.registerTempTable("test_data")
resultsDF = sqlContext.sql("select * from results").toDF()


resDF=pd.DataFrame(resultDF)
header = ["lab_key", "tray_id", "time", "gene_id", "source"]

# removed pandas from below line
resDF.to_csv("/data/results.csv", sep=",", columns = header)

【讨论】:

  • import pandas as pd lines = sqlContext.read.parquet("hdfs:////data/lab_01/") lines.registerTempTable("test_data") resultsDF = sqlContext.sql("select *从结果") resDF=pd.DataFrame(resultsDF) header = ["lab_key", "tray_id", "time", "gene_id", "source"] resDF.to_csv("/data/results.csv", sep= ",", 列 = 标题)
  • 上面的 resDF=pd.DataFrame(resultsDF) 给了我一个错误:ValueError: DataFrame constructor not proper call!我认为 resDF 应该用在最后一行。
  • 好的,您还有其他建议吗?
  • 添加 .toDF() 获取查询的位置。查看编辑后的答案
  • 发生错误:ParseException: "\nextraneous input '10' Expecting {, '(', ',', '.', '[', 'SELECT', 'FROM', '添加','AS','ALL','DISTINCT','WHERE','GROUP','BY','GROUPING','SETS','CUBE','ROLLUP','ORDER',.. .
【解决方案3】:

您可以选择以下选项:

df.rdd.map(lambda line: ",".join[t1 for t1 in line]).saveAsTextFile("filename")

df.rdd.map(lambda line: ",".join(map(str, line) ) ).saveAsTextFile("filename")

让 ms 知道这是否有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 2018-11-09
    • 2021-03-19
    • 2019-09-02
    相关资源
    最近更新 更多