在这种情况下,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));;
任何提示表示赞赏!