首页 > 解决方案 > 在加载多个文件的情况下,带有 inferschema=True 的 spark.read.csv 的行为

问题描述

我在尝试将多个 csv 文件同时加载到 Spark 时遇到了困难(相当奇怪的结果)

df = spark.read.csv('/dir/*.csv', header=True, inferSchema=True)
df.printschema()
# Sale_Value  String(nullable=true)  # it should be Double/float
# Name String # Fine for all string columns

所以基本上我所有的整数和双列都转换为字符串类型,我希望它是双精度类型,因为我将 inferschema 参数传递为 true。

我检查了我的数据并确认没有空值或任何字符串值。

奇怪的是->

  1. 我将每个文件读入单独的 dfs,df1=spark.read.csv(file1, inferSchema=True), df2=spark.read.csv(file2, inferSchema=True),然后为每个数据帧打印模式,所有模式都为预期的(dpouble 是双倍的,字符串是字符串)

  2. 我开始将每个单独的 dfs 附加到单个 df 中,例如 df = df1.union(df2), df= df.union(df2)..etc 并检查打印 df.printSchema(),然后所有结果都符合预期......不那个问题。

所以我对单个加载状态(* .csv)中多个文件加载的行为感到困惑。

我对 inferSchema 行为有什么遗漏吗?请阐明一些观点。

编辑

我的数据是双引号括起来的(以避免在字段中找到逗号时拆分记录),例如:“name”,“sale_target”,“sale_V”,“gender”....

我有 3 个文件,其中 2 个文件是引号括起来的,一个文件没有引号括起来(这就是原因,我遇到了这个问题,我删除了没有引号的文件,猜猜一切工作完美)。

因此,如果我使用/读取/加载多个 csv 文件,那么我必须使用 all-files-QuoteEnclosed 或 all-file-without-QuoteEnclosed 吗?

文件位置https://github.com/satya-panda/king-s-things

标签: apache-sparkdataframepyspark

解决方案


推荐阅读