是否可以以相同或不同的顺序将具有相同标题或标题子集的多个 csv 文件读取到 spark 数据帧中?
Posted
技术标签:
【中文标题】是否可以以相同或不同的顺序将具有相同标题或标题子集的多个 csv 文件读取到 spark 数据帧中?【英文标题】:Is it possible to read multiple csv files with same header or subset of header in same or different order into spark data frame? 【发布时间】:2017-03-30 04:42:25 【问题描述】:我在一个文件夹中有许多 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 中处理它。
【问题讨论】:
你能解决这个问题吗?我正在寻找类似的东西。 我有完全相同的问题要解决。在数据目录中,添加了新的 csvs,并且 spark 作业读取了该目录。新的 csv 可以有更多的列来改变现有列的顺序。我想在 spark 中处理这个问题并适应新字段或以某种方式忽略这些字段。 【参考方案1】:您需要为每种结构构建一个数据框。 说
标头“a”、“b”、“c”的 DF1 标头“b”、“c”、“a”的 DF2 标头“a”、“b”的 DF3以编程方式读取每个文件的第一个标题,并根据相似的标题将其放置在不同的目录中。
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 可用于进一步的程序逻辑。
【讨论】:
非常感谢您的回答。在我的情况下,所有文件都在同一个目录中。如果我不知道哪个文件将具有哪种标题格式,有没有办法加载它们? 您可以在LOOP中读取文件并将每个文件加载到数据框中,稍后您可以根据公共字段合并所有这些数据框。 @ArvindKumar 这行得通,但听起来过于昂贵的操作。有没有更好的方法来处理这个问题? @AkshatChaturvedi - 选项 1 我们可以使用 Python 或任何其他编程语言作为预处理合并文件,然后在合并文件上创建 DF 以进行进一步处理。选项2:在循环中读取文件并继续插入一些临时表并在临时表上创建DF以进行进一步处理。【参考方案2】:你可以试试 .option("mergeSchema", "true")。它对我有用。
【讨论】:
以上是关于是否可以以相同或不同的顺序将具有相同标题或标题子集的多个 csv 文件读取到 spark 数据帧中?的主要内容,如果未能解决你的问题,请参考以下文章
将具有相同或不同长度的2个不同整数数组合并为一个大数组,并将它们从最小到最大排序