Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 具有不同列的两个Spark数据帧的并集_Apache Spark_Apache Spark Sql_Union All - Fatal编程技术网

Apache 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

我试图用不同的列集合合并两个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[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')