使用spark流解析事件中心复杂数组类型的消息

wixjitnu  于 2021-07-09  发布在  Spark
关注(0)|答案(1)|浏览(434)

我需要在读取eventhub时解析body中的数组类型。我们有嵌套的json消息,但无法解析相同的消息:
{“name”:“rohit”,“salary”:“29292”,“empid”:12,“projects”:[{“projectid”:“9191”,“projectname”:“”,“duration”:“79”},{“projectid”:“9192”,“projectname”:“xyz”,“duration”:“75”}]}
我试图用下面的方法修改模式:但是似乎有一些问题。

val testSchema = new StructType()
  .add("Name", StringType)
  .add("Salary", StringType)
  .add("EmpID", StringType)      
  .add("Projects", new ArrayType(new StructType()
    .add("ProjectID", StringType)
    .add("ProjectName", StringType)
    .add("Duration", StringType)))

任何帮助都将不胜感激。

flvlnr44

flvlnr441#

如果没有确切的错误,很难说,但是看起来您在模式定义中有一个错误-您需要修改模式以添加指定数组元素是否可以为null的标志(请参阅 true 嵌套结构类型后的标志)。直接读取json或从字符串转换json时,以下模式可以正常工作:

val testSchema = new StructType()
  .add("Name", StringType)
  .add("Salary", StringType)
  .add("EmpID", StringType)      
  .add("Projects", new ArrayType(new StructType()
    .add("ProjectID", StringType)
    .add("ProjectName", StringType)
    .add("Duration", StringType), true))

scala> spark.read.schema(testSchema).json("file.json").show(truncate=false)
+-----+------+-----+----------------------------------+
|Name |Salary|EmpID|Projects                          |
+-----+------+-----+----------------------------------+
|Rohit|29292 |12   |[{9191, abc, 79}, {9192, xyz, 75}]|
+-----+------+-----+----------------------------------+

scala> import org.apache.spark.sql.functions._
import org.apache.spark.sql.functions._

scala> val df = spark.read.text("file.json")
df: org.apache.spark.sql.DataFrame = [value: string]

scala> df.select(from_json($"value", testSchema)).show(truncate=false)
+------------------------------------------------------+
|from_json(value)                                      |
+------------------------------------------------------+
|{Rohit, 29292, 12, [{9191, abc, 79}, {9192, xyz, 75}]}|
+------------------------------------------------------+

相关问题