it-roy-ru.com

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

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

myDF.registerTempTable("myDF")

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

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

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

12
sfactor

Backticks (`), кажется, работают, поэтому

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

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

36
PermaFrost

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

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

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

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

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

ns2: struct.struct.field обратные ссылки (`) не работают.

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()
1
GreenThumb