如何在结构化流中将JSON消息转换为DataFrame?

时间:2019-07-17 23:57:02

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

我有一个从kafka读取的spark流代码,但是我拥有的值是这样的:

"{ id:'1',name: 'John', address: 'Highway 37' }|{ id:'2',name: 'Marta', address: 'Highway 37' }|{ id:'3',name: 'Juan', address: 'Highway 37' }|{ id:'4',name: 'Erick', address: 'Highway 37' }|{ id:'6',name: 'Alex', address: 'Highway 37' }|{ id:'7',name: 'Juanjo', address: 'Highway 37' }|{ id:'8',name: 'Pam', address: 'Highway 37' }|{ id:'9',name: 'Paty', address: 'Highway 37' }|{ id:'10',name: 'Diana', address: 'Highway 37' }"

是json的字符串集,这是我的kafka值:

val kafkaRawData = df.selectExpr("CAST(value AS string)")

但是我想将此字符串json数据集转换为数据框或数据集,我该怎么做?

2 个答案:

答案 0 :(得分:1)

您应该只使用具有以下签名的from_json标准函数和DataStreamWriter.foreachBatch运算符:

video{
position: relative;
}
#overelay{
position: absolute;
width: 100%;
height: 100%;
opacity: 0;
top:0px;
}

使用foreachBatch(function: (Dataset[T], Long) ⇒ Unit): DataStreamWriter[T] 可以将字符串转换为正确的JSON,而from_json则可以使您每个微批量访问foreachBatch

答案 1 :(得分:1)

使用from_json函数处理json字符串到对象的转换。为了简化此过程或使其更通用,请将示例json字符串保存在文件中以从中读取以推断架构。使用此架构并将其传递给函数。有时,对于复杂的json对象,使用StructType创建架构可能会变得很麻烦。

val schema = spark.read.json(sampleFilePath).schema
inputDF.selectExpr("CAST(value AS STRING) as data")
    .select(from_json(col("data"),schema).as("data"))