Подтвердить что ты не робот

Как избежать имен столбцов с дефисом в Spark SQL

Я импортировал json файл в Spark и преобразовал его в таблицу как

myDF.registerTempTable("myDF")

Затем я хочу запустить SQL-запросы в этой результирующей таблице

val newTable = sqlContext.sql("select column-1 from myDF")

Однако это дает мне ошибку из-за hypen в имени столбца column-1. Как я могу решить это Spark SQL?

4b9b3361

Ответ 1

Backticks (`) работают, поэтому

val newTable = sqlContext.sql("select `column-1` from myDF")

должен сделать трюк, по крайней мере, в Spark v1.3.x.

Ответ 2

Я не могу комментировать, поскольку у меня меньше 50 повторений

Когда вы ссылаетесь на структуру json с struct.struct.field и существует пространство имен, подобное:

ns2: struct.struct.field backticks (`) не работает.

jsonDF = sqlc.read.load('jsonMsgs', format="json")
jsonDF.registerTempTable("masterTable")
sqlc.select("select `sn2:AnyAddRq.AnyInfo.noInfo.someRef.myInfo.someData.Name` AS sn2_AnyAddRq_AnyInfo_noInfo_someRef_myInfo_someData_Name from masterTable").show()

pyspark.sql.utils.AnalysisException: u "не может решить" sn2:AnyAddRq.AnyInfo.noInfo.someRef.myInfo.someData.Name '

Если я удалю поля sn2: запрос выполняется.

Я также пробовал с одиночной цитатой ('), обратной косой чертой (\) и двойными кавычками ("")

Единственный способ, которым это работает, если я зарегистрирую другую временную таблицу в sn2: strucutre, я могу получить доступ к полям внутри нее, как это

anotherDF = jsonDF.select("sn2:AnyAddRq.AnyInfo.noInfo.someRef.myInfo.someData")
anotherDF.registerTempTable("anotherDF")
sqlc.select("select Name from anotherDF").show()

Ответ 3

Был ли у него немного вчера, оказывается, есть способ избежать (:) и a (.) так:

Только поле, содержащее (:), должно быть экранировано с обратными окнами

sqlc.select("select `sn2:AnyAddRq`.AnyInfo.noInfo.someRef.myInfo.someData.Name AS sn2_AnyAddRq_AnyInfo_noInfo_someRef_myInfo_someData_Name from masterTable").show()