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?
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.
É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()
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()