【问题标题】:pyspark load csv file into dataframe using a schemapyspark 使用模式将 csv 文件加载到数据框中
【发布时间】:2019-02-13 13:24:35
【问题描述】:

我是 pyspark 的新手,正在使用 Spark 2.2.0 版和 Python 2.7.12 版开发 pyspark

我正在尝试将 2 个 .csv 文件(具有超过 1 个标题行)读入 2 个具有已知架构的不同数据帧并执行比较操作。

我不确定是否有任何最佳/更好的方法来创建架构文件(包括列名、数据类型、可空性)并在 pyspark 程序中引用它以加载到数据帧中。

我为第一个文件编码如下:

  1. 创建一个 yaml 文件来存储文件路径和架构

  2. 读取模式文件并在循环中动态构造 StructField(column name, datatype, nullanbility)。 例子: [StructField(column1,Integer,true), StructField(column2,string,true), StructField(column3,decimal(10,2),true), ....]

  3. 将数据文件读入RDD并删除2个标题行(将使用减法函数)

  4. 使用 sqlContext.createDataFrame 通过传递 RDD、模式结构创建数据帧。

我可以为第一个文件的示例数据执行这些步骤。

请建议是否有更好的方法(我还没有探索 StructType 的 fromDDL 选项)。为第二个文件创建类似的数据框后,需要应用功能逻辑。

谢谢

【问题讨论】:

  • 只是想明白,你的每个 csv 文件都有 '1' header 。那么,'2' csv 文件你有并且想用你说的方法“删除 2 个标题行”?
  • csv 文件每个有 2 个标题
  • 我能够完成这 4 个步骤并创建数据框。保持开放以了解是否有更好的方法。

标签: pyspark apache-spark-sql


【解决方案1】:

如何使用 pyspark spark.read.csv 读取文件,其中 stucttype 用于架构,选项 header=true 和 mode=DROPMALFORMED 将忽略任何与架构不匹配的记录。

【讨论】:

  • 嗨,Ron D,保持 header=true 不起作用。相反,我所做的只是强制执行模式而不指定标头。之后,我使用 dropna 选项过滤掉了 2 个标题记录。保持问题的开放性以了解哪种方法更好。
【解决方案2】:

我可以使用 yaml 配置文件(存储架构)并从 pyspark 读取以动态构建 StructType。

它正在工作并满足要求。如果有更好的方法,很高兴听到。

【讨论】:

    猜你喜欢
    • 2017-06-03
    • 2021-12-20
    • 1970-01-01
    • 2015-10-02
    • 2020-05-23
    • 2018-05-05
    • 2016-12-13
    • 2015-06-08
    • 1970-01-01
    相关资源
    最近更新 更多