Spark SQL嵌套JSON错误“输入中没有可行的选择”

时间:2019-06-01 20:38:54

标签: apache-spark apache-spark-sql

Spark SQL嵌套JSON错误:

{  
   "x":{  
      "name":"bla",
      "address":"bla bla",

             "age":"16"
   },
   "666":{  
      "name":"not working",
      "address":"not good",

             "age":"16"
   }
}

当读取spark.sql(“从表中选择cast(x.age为long)作为age_t”)时将起作用,但是:spark.sql(“从表中选择cast(x.age作为long_age)作为age_t”)会抛出异常:

org.apache.spark.sql.catalyst.parser.ParseException: 输入'cast(666.age

当我为myDF.select(“ 666.age”)使用datafame api时,它的工作。 任何有体面的解释的人:)

1 个答案:

答案 0 :(得分:3)

这是因为SQL列名应该以字母或其他字符(例如_@#)开头,而不是数字开头。我们来看一个简单的例子:

Seq((1, 2)).toDF("x", "666").createOrReplaceTempView("test")

呼叫spark.sql("SELECT x FROM test").show()将会输出

+---+
|  x|
+---+
|  1|
+---+

但调用spark.sql("SELECT 666 FROM test").show()会输出

+---+
|666|
+---+
|666|
+---+

因为666被解释为文字,而不是列名。要解决此问题,需要使用backticks来引用列名:

spark.sql("SELECT `666` FROM test").show()
+---+
|666|
+---+
|  2|
+---+