我有一个带有JSON的Kafka流媒体源,例如{"type":"abc","1":"23.2"}

该查询给出以下异常:

org.apache.spark.sql.catalyst.parser.ParseException:  extraneous
input '.1' expecting {<EOF>, .......}
 == SQL ==
person.1

访问"person.1"的正确语法是什么?

我什至将DoubleType更改为StringType,但这也不起作用。仅通过保留person.type并删除person.1中的selectExpr,示例就可以很好地工作:
val personJsonDf = inputDf.selectExpr("CAST(value AS STRING)")
val struct = new StructType()
  .add("type", DataTypes.StringType)
  .add("1", DataTypes.DoubleType)
val personNestedDf = personJsonDf
  .select(from_json($"value", struct).as("person"))
val personFlattenedDf = personNestedDf
  .selectExpr("person.type", "person.1")
val consoleOutput = personNestedDf.writeStream
  .outputMode("update")
  .format("console")
  .start()

最佳答案

有趣的是,因为select($"person.1")应该可以正常工作(但是您使用的selectExpr可能会使Spark SQL感到困惑)。
StructField(1,DoubleType,true)不起作用,因为类型实际上应该是StringType

让我们来看看...

$ cat input.json
{"type":"abc","1":"23.2"}

val input = spark.read.text("input.json")
scala> input.show(false)
+-------------------------+
|value                    |
+-------------------------+
|{"type":"abc","1":"23.2"}|
+-------------------------+

import org.apache.spark.sql.types._
val struct = new StructType()
  .add("type", DataTypes.StringType)
  .add("1", DataTypes.StringType)
val q = input.select(from_json($"value", struct).as("person"))
scala> q.show
+-----------+
|     person|
+-----------+
|[abc, 23.2]|
+-----------+

val q = input.select(from_json($"value", struct).as("person")).select($"person.1")
scala> q.show
+----+
|   1|
+----+
|23.2|
+----+

关于apache-spark - 如何访问嵌套架构列?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54193697/

10-16 00:55