Вложенная ошибка JSON в Spark SQL "нет подходящей альтернативы при вводе" - PullRequest
0 голосов
/ 01 июня 2019

Ошибка JSON вложенного SQL Spark:

{
  "xxxDetails":{  
      "yyyData":{  
         "0":{  
            "additionalData":{  

            },
            "quantity":80000,
            "www":12.6,
            "ddd":5.0,
            "eee":72000,
            "rrr":false
         },
         "130":{  
            "additionalData":{  
               "quantity":1
            },
            "quantity":0,
            "www":1.0,
            "ddd":0.0,
            "eee":0,
            "rrr":false
         },
         "yyy":{  
            "additionalData":{  
               "quantity":1
            },
            "quantity":0,
            "www":1.0,
            "ddd":0.0,
            "eee":0,
            "rrr":false
         }       
      }
   },
   "mmmDto":{  
      "id":0,
      "name":"",
      "data":null
   }
 }

при чтении spark.sql («выберите приведение (xxxDetails.yyyData.yyy.additionalData.quantity как Long) как количество из таблицы»), это будет работать, но: spark.sql («выберите приведение (xxxDetails.yyyData.130.additionalData.quantity as Long) как количество из таблицы») будет выдано исключение:

org.apache.spark.sql.catalyst.parser.ParseException: нет жизнеспособной альтернативы при вводе 'cast (xxxDetails.yyyData.130.

Когда я использую API datafame для myDF.select ("xxxDetails.yyyData.130.additionalData.quantity") его работы. Любой, у кого естьдостойное объяснение:)

1 Ответ

3 голосов
/ 02 июня 2019

Это потому, что имена столбцов 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|
+---+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...