Ответ 1
Backticks (`) работают, поэтому
val newTable = sqlContext.sql("select `column-1` from myDF")
должен сделать трюк, по крайней мере, в Spark v1.3.x.
Я импортировал json файл в Spark и преобразовал его в таблицу как
myDF.registerTempTable("myDF")
Затем я хочу запустить SQL-запросы в этой результирующей таблице
val newTable = sqlContext.sql("select column-1 from myDF")
Однако это дает мне ошибку из-за hypen в имени столбца column-1
. Как я могу решить это Spark SQL?
Backticks (`) работают, поэтому
val newTable = sqlContext.sql("select `column-1` from myDF")
должен сделать трюк, по крайней мере, в Spark v1.3.x.
Я не могу комментировать, поскольку у меня меньше 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()
Был ли у него немного вчера, оказывается, есть способ избежать (:) и a (.) так:
Только поле, содержащее (:), должно быть экранировано с обратными окнами
sqlc.select("select `sn2:AnyAddRq`.AnyInfo.noInfo.someRef.myInfo.someData.Name AS sn2_AnyAddRq_AnyInfo_noInfo_someRef_myInfo_someData_Name from masterTable").show()