Как получить доступ к столбцу вложенной схемы? - PullRequest
0 голосов
/ 15 января 2019

У меня есть потоковый источник Kafka с JSON, например, {"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()

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Интересно, поскольку 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|
+----+
0 голосов
/ 16 января 2019

Я решил эту проблему с помощью person.*

+-----+--------+
|type | 1      |
+-----+--------+
|abc  |23.2    |
+-----+--------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...