2015-06-17 15 views
10

ich eine JSON-Datei in Funken importiert haben, zu entkommen und convertd es in eine Tabelle alsWie Spaltennamen mit Bindestrich in Spark-SQL

myDF.registerTempTable("myDF") 

Ich möchte dann SQL-Abfragen auf dieser Ergebnistabelle laufen

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

jedoch gibt dies mir einen Fehler, da der Bindestrich im Namen der Spalte column-1. Wie kann ich dies beheben, ist Spark SQL?

+0

versuchen, sie mit einfachen Anführungszeichen sqlContext.sql („wählen sie‚Spalte-1‘von myDF“) – Identity1

+2

das wird behandeln funktioniert nicht, weil es zu entkommen ‚Spalte-1‘ als String kein Spaltenname. – sfactor

+0

Der SQL-99-Standard legt fest, dass doppelte Anführungszeichen („) verwendet werden, Kennungen zu begrenzen. Probieren Sie sich mit doppelten Anführungszeichen vielleicht die äußeren in einfachen Anführungszeichen – Identity1

Antwort

29

Backticks (`) erscheinen, zu arbeiten, so

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

den Trick tun sollte, zumindest in Funken v1.3.x.

+0

funktioniert auch in pyspark! – Sean

+0

yay! Funktioniert auch für colon. – Jesse

1

Ich kann nicht sagen, da ich weniger als 50 Wiederholungen

Wenn Sie eine json Struktur mit struct.struct.field Referenzierung und es gibt einen Namensraum vorhanden wie:

ns2: struct.struct.field Die Backticks (`) funktionieren nicht.

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 "nicht lösen 'sn2:AnyAddRq.AnyInfo.noInfo.someRef.myInfo.someData.Name'

Wenn ich die sn2- entfernen: Felder, führt die Abfrage

ich auch mit Apostroph versucht haben (. ‚), Backslash (\) und doppelte Anführungszeichen (‚‘)

der einzige Weg, es funktioniert, wenn wenn ich eine andere temporäre Tabelle auf dem sn2- registrieren: strucutre, ich in ihr die Felder der Lage, den Zugriff bin wie so

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

gestern ein wenig an ihm war, stellt sich heraus, es ist ein Weg der (zu entkommen :) und a() wie folgt:.

Nur das Feld enthält (:) mit Backticks werden muss entkam

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