Scala Spark:可以从不同格式的多个文件加载RDD吗?

Scala Spark:可以从不同格式的多个文件加载RDD吗?,scala,apache-spark,spark-dataframe,rdd,file-format,Scala,Apache Spark,Spark Dataframe,Rdd,File Format,我有一个异构格式的文件输入,批处理模式 我想在多个文件上运行批处理。这些文件具有不同的格式,它们将具有不同的映射以规范化数据(例如,将记录中具有不同模式名称或位置的字段提取为标准命名) 鉴于数据的表格性质,我正在考虑使用Dataframes(由于我必须使用Spark版本,所以无法使用数据集) 为了对每个文件应用不同的提取逻辑,是否需要将每个文件加载到单独的数据帧中,然后应用提取逻辑(提取一些文件,每个文件类型的过程不同,配置方式如CSV/JSON/XML、要选择的字段位置(CSV)、要选择的字段

我有一个异构格式的文件输入,批处理模式

我想在多个文件上运行批处理。这些文件具有不同的格式,它们将具有不同的映射以规范化数据(例如,将记录中具有不同模式名称或位置的字段提取为标准命名)

鉴于数据的表格性质,我正在考虑使用Dataframes(由于我必须使用Spark版本,所以无法使用数据集)

为了对每个文件应用不同的提取逻辑,是否需要将每个文件加载到单独的数据帧中,然后应用提取逻辑(提取一些文件,每个文件类型的过程不同,配置方式如CSV/JSON/XML、要选择的字段位置(CSV)、要选择的字段名称(JSON)等),然后加入数据集? 这将迫使我迭代文件,分别处理每个数据帧,然后加入数据帧;而不是应用相同的(可配置的)逻辑

我知道我可以使用RDD,也就是说,将所有文件加载到RDD中,发出PairRDD[fileId,record],然后运行一个映射,在该映射中,您可以查找fileId,以获得要应用于该记录的配置,这会告诉您要应用的逻辑

我宁愿使用Dataframes,因为它在性能、简单性和解析方面比原始RDD提供了更多的细节

有没有比前面解释的更好的方法来使用数据帧来解决这个问题?我有什么建议或误解吗


我使用的是Scala,不过这与这个问题无关。

为什么不将解析逻辑和转换逻辑分开呢。为每种类型创建单独的数据帧,并对其应用union,然后您可以在此组合的数据帧上运行转换逻辑。在这种情况下不会有性能开销。我同意在可能的情况下:)但是,一旦我创建了单独的数据帧,我会让每个数据帧具有不同的列模式,因此我猜连接它们会导致非统一结构,因为表示相同的值不会被理解为相同的值(即不在同一列下,但根据字段名称不同).对吗?你可以应用转换并将它们带到公共模式。是的,我可以这样做-分别转换数据帧,一旦它们具有相同的模式,就连接它们。但是,我不会进行太多的并行化,因为转换将在每个单独的数据帧上进行,而不是在一个数据帧中进行。另外,因为每个键对应于每个fi最终缩减阶段的le将针对每个文件(文件上的记录将具有相同的密钥,不同于下一个文件的记录)我认为这不会给表增加太多内容。为什么不将解析逻辑和转换逻辑分开。为每种类型创建单独的数据帧,并对它们应用union,然后可以在这个组合的数据帧上运行转换逻辑。在这种情况下不会有性能开销。我同意在可能的情况下:)但是,一旦我创建了单独的数据帧,每个数据帧都有一个不同的列模式,所以我猜连接它们会导致一个不统一的结构,因为表示相同的值不会被理解为相同的值(即,不在同一列下,但根据字段的名称不同)。对吗?你可以应用转换并将它们带到公共模式。是的,我可以这样做-分别转换数据帧,一旦它们具有相同的模式,就加入它们。但是,我不会进行太多的并行化,因为转换将在每个单独的数据帧上进行,而不是在一个数据帧中进行。另外,由于在最终缩减阶段,每个文件的每个键都是每个文件的(一个文件上的记录将具有相同的键,不同于下一个文件的记录),我认为这不会给表增加太多内容。