是否有可能以相同或不同的顺序将具有相同标题或标题子集的多个csv文件读入spark数据框?

时间:2016-11-16 05:03:12

标签: scala csv apache-spark dataframe

我在文件夹中有许多csv文件要加载到spark数据框中。它们都有相同的标题或标题,它是最长标题的子集,但顺序不同。

  • 文件1标题 - "a","b","c"
  • 文件2标题 - "b","c","a"
  • 文件3标题 - "a","b"

我的架构有a,b,c个字段。我正在尝试阅读

sqlcontext.read
  .format("com.databricks.spark.csv")
  .option("delimiter",",")
  .option("header","true")
  .load("file*.csv")

是否可以以相同或不同的顺序将多个具有相同标题或标题子集的csv文件读入spark数据框?而不是编辑文件来添加或更改列顺序,我想在spark中处理它。

2 个答案:

答案 0 :(得分:0)

您需要为每种结构构建一个数据帧。 说

  • 标题的DF1" a"," b"," c"
  • 标题的DF2" b"," c"," a"
  • 标题的DF3" a"," b"

以编程方式读取每个文件的第一个标题,并根据类似的标题将其放在不同的目录中。

DF1 = sqlcontext.read.format("com.databricks.spark.csv").option("delimiter",",").option("header","true").load("DIRECTORY1/file*.csv")
DF2 = sqlcontext.read.format("com.databricks.spark.csv").option("delimiter",",").option("header","true").load("DIRECTORY2/file*.csv")  
DF3 = sqlcontext.read.format("com.databricks.spark.csv").option("delimiter",",").option("header","true").load("DIRECTORY3/file*.csv")
....

最终数据框:

DF = DF1.select("a", "b","c").union.DF2.select("a","b","c").union.DF3.select("a","b","")

最终数据帧DF可用于进一步的程序逻辑。

答案 1 :(得分:0)

你可以试试 .option("mergeSchema", "true")。它对我有用。