如何将Spark Streaming输出包装在数组括号中?

时间:2018-08-08 13:43:00

标签: scala apache-spark spark-structured-streaming

Spark:2.3.0 Scala:2.11.12

我正在使用spark结构流从kafka主题流式传输并将结果输出到另一个kafka主题。

val mySchema = StructType(StructField("foo", StringType, true) :: Nil)

输入数据[{"foo":"bar"}]

当我使用select(from_json(col(A), mySchema))方法时,它从数组内部解析对象并将其放在我的模式中。

我想做的是在过滤dataFrame转换的最后,将mySchema包装在一个数组中,以便输出看起来是一样的:[{"foo":"bar"}]

但是,我只能在没有数组括号的情况下输出结果Dataframe{"foo":"bar"}

1 个答案:

答案 0 :(得分:1)

您需要重新定义架构,因为您希望将输入视为struct类型的数组,即array<struct<foo:string>>

val mySchema = ArrayType(StructType(Seq(StructField("foo", StringType, true))),true)
val target = df.select(from_json(col("A"), mySchema).alias("A"))

target.printSchema
//root
// |-- A: array (nullable = true)
// |    |-- element: struct (containsNull = true)
// |    |    |-- foo: string (nullable = true)

target.select(to_json($"A")).show
//+----------------+
//|structstojson(A)|
//+----------------+
//| [{"foo":"bar"}]|
//+----------------+