web-dev-qa-db-fra.com

Comment échapper aux noms de colonne avec un trait d'union dans Spark SQL

J'ai importé un fichier JSON dans Spark et l'ai converti en tableau 

myDF.registerTempTable("myDF")

Je veux ensuite exécuter des requêtes SQL sur cette table résultante 

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

Cependant, cela me donne une erreur en raison de la taille du nom de la colonne column-1. Comment puis-je résoudre ceci est Spark SQL?

12
sfactor

Les Backticks (`) semblent fonctionner, donc

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

devrait faire l'affaire, au moins dans Spark v1.3.x.

36
PermaFrost

Était à elle pour un peu hier, se révèle il y a un moyen d'échapper à la (:) et un (.) Comme suit:

Seul le champ contenant (:) doit être échappé avec des backticks

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

Je ne peux pas commenter car j'ai moins de 50 représentants

Lorsque vous référencez une structure json avec struct.struct.field et qu'il existe un espace de noms tel que:

ns2: struct.struct.field les backticks (`) ne fonctionnent pas.

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 "ne peut pas résoudre 'sn2:AnyAddRq.AnyInfo.noInfo.someRef.myInfo.someData.Name'

Si je supprime les champs sn2:, la requête est exécutée. 

J'ai également essayé avec guillemets simples ('), barres obliques inverses (\) et guillemets doubles ("") 

La seule façon dont cela fonctionne si, si j'inscris une autre table temporaire sur le sn2: strucutre, je peux accéder aux champs qu'il contient comme ça

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