Apache spark 具有不同列的两个Spark数据帧的并集
我试图用不同的列集合合并两个Spark数据帧。为此,我参考了以下链接:- 我的代码如下:Apache spark 具有不同列的两个Spark数据帧的并集,apache-spark,apache-spark-sql,union-all,Apache Spark,Apache Spark Sql,Union All,我试图用不同的列集合合并两个Spark数据帧。为此,我参考了以下链接:- 我的代码如下: val cols1=finalDF.columns.toSet val cols2=df.columns.toSet val total=cols1++cols2 finalDF=finalDF.select(expr(cols1,总计):*).unionAll(df.select(expr(cols2,总计):*)) def expr(myCols:Set[String],allCols:Set[Str
val cols1=finalDF.columns.toSet
val cols2=df.columns.toSet
val total=cols1++cols2
finalDF=finalDF.select(expr(cols1,总计):*).unionAll(df.select(expr(cols2,总计):*))
def expr(myCols:Set[String],allCols:Set[String])={
allCols.toList.map(x=>x匹配{
如果myCols.包含(x)=>col(x),则为案例x
大小写=lit(null).as(x)
})
}
但我面临的问题是两个数据帧中的一些列都是嵌套的。我有StructType和primitive类型的列。现在,假设A列(StructType)在df中,而不是在finalDF中。但在expr中
case\u=>lit(null).as(x)
不是让它成为StructType。这就是为什么我不能把他们联合起来。它给了我以下错误-
org.apache.spark.sql.AnalysisException: Union can only be performed on tables with the compatible column types. NullType <> StructType(StructField(_VALUE,StringType,true), StructField(_id,LongType,true)) at the first column of the second table.
org.apache.spark.sql.AnalysisException:只能对具有兼容列类型的表执行联合。第二个表第一列的NullType StructType(StructField(_-VALUE,StringType,true)、StructField(_-id,LongType,true))。
有什么建议我可以在这里做吗 对此,我会使用内置的模式推断。它比匹配复杂结构要贵得多,但可能会有冲突:
spark.read.json(df1.toJSON.union(df2.toJSON))
您还可以同时导入所有文件,并使用input\u file\u name
将从标题中提取的信息加入
import org.apache.spark.sql.function
val metadata: DataFrame // Just metadata from the header
val data: DataFrame // All files loaded together
metadata.withColumn("file", input_file_name)
.join(data.withColumn("file", input_file_name), Seq("file"))
将用空值填充缺少的数据。请检查此stackoverflow。@NinjaDev82是的,我可以同时导入所有文件及其工作状态。但我需要添加一个列,该列的值是从同一文件的头中提取的(我正在将一个xml文件导入spark dataframe)。所以,我将数据导入spark dataframe,从中提取出标题,并将该值添加到该df中的一个新列中。每个df的标题值不同。
df = df1.join(df2, ['each', 'shared', 'column'], how='full')