Spark结构化流-UNIONed数据帧无法进行进一步转换

时间:2018-06-22 10:54:23

标签: spark-structured-streaming

在这种情况下,Spark结构化流从hdfs中读取实木复合地板数据。作为第一个转换,我使用一个简单的 filter map 。然后使用 union 合并接收到的数据和转换后的数据。 现在,如果我使用由 union 创建的新数据,即系统返回异常。

注意::如果使用原始流数据或没有 union 的转换结果,系统运行正常。

代码和异常分别显示如下:

case class spo(s: String, p: String, o: String)
case class so(s: String, o: `String)

val schemaTripleStruct = StructType(
StructField("s", StringType, true) ::
StructField("p", StringType, true) ::
StructField("o", StringType, true) :: Nil)

val twoPartsStruct = StructType(
StructField("_1", StringType, true) ::
StructField("_2", StringType, true) :: Nil)

val triples = spark.
  readStream.
  schema(schemaTripleStruct).
  parquet(parquetFiles)

var r7 = spark.createDataFrame(sc.emptyRDD[Row], schemaTripleStruct)
var r7Total = spark.createDataFrame(sc.emptyRDD[Row], schemaTripleStruct)

// _X is a broadcasted variable
r7 = triples.filter(t => _X.value.contains(t.getString(1))).map(t => spo(t.getString(0), _X.value(t.getString(1)), t.getString(2))).toDF
r7Total = triples.union(r7).toDF

var r2 = spark.createDataFrame(sc.emptyRDD[Row], twoPartsStruct)

// _Y is a broadcasted variable
r2 = r7Total.filter(t => _Y.value.contains(t.getString(1))).map(t => so(t.getString(0), _Y.value(t.getString(1)))).toDF

r2.toDF.writeStream.
outputMode(OutputMode.Append).
format("parquet").
option("checkpointLocation", checkpointPath).
option("path", outputPath).
start().
awaitTermination()

用户类引发异常:org.apache.spark.sql.streaming.StreamingQueryException:解析的属性s#155,p#156,o#157缺少s#162,p#163,o #164 in operator!TypedFilter,接口org.apache.spark.sql.Row,[StructField(s,StringType,true),StructField(p,StringType,true),StructField(o,StringType,true)],createexternalrow(s #155.toString,p#156.toString,o#157.toString,StructField(s,StringType,true),StructField(p,StringType,true),StructField(o,StringType,true));;

任何提示表示赞赏!

0 个答案:

没有答案