2015-06-17 7 views
10

Mam importowanego pliku json w Spark i convertd go do tabeli jakoJak uciec nazwy kolumn z myślnikiem w Spark SQL

myDF.registerTempTable("myDF") 

Następnie chcę uruchomić zapytań SQL na tej wynikającej tabeli

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

Jednak powoduje to błąd z powodu hipen w nazwie kolumny column-1. Jak rozwiązać ten problem to Spark SQL?

+0

Spróbuj uciec je apostrofami sqlContext.sql („select«column-1»z myDF”) – Identity1

+2

to nie działa, ponieważ będzie ono traktować „kolumnę-1” jako ciąg nie nazwa kolumny. – sfactor

+0

Standard SQL-99 określa, że ​​podwójny cudzysłów (") służy do rozgraniczania identyfikatorów. Spróbuj je z podwójnymi cudzysłowami, może zachowując zewnętrzne w pojedynczych cudzysłowach – Identity1

Odpowiedz

29

backticks (`) wydają się pracować, więc

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

powinno wystarczyć, przynajmniej w Spark v1.3.x.

+0

działa również w Pysparku! – Sean

+0

yay! Działa również na dwukropek. – Jesse

1

nie mogę się wypowiedzieć, jak mam mniej niż 50 powtórzeń

Po przedstawieniu struktury json z struct.struct.field i jest obecny nazw jak:

ns2: struct.struct.field backticks (`) nie działa.

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 "nie może rozwiązać 'sn2:AnyAddRq.AnyInfo.noInfo.someRef.myInfo.someData.Name'

Jeśli usunąć SN2: pola, kwerenda wykonuje

Próbowałem również z pojedynczy cudzysłów (. „), odwrotny ukośnik (\) i podwójne cudzysłowy («»)

jedyny sposób to działa, czy gdybym zarejestrować inną tabelę temp na SN2: strucutre, jestem w stanie uzyskać dostęp do pól w nim jak tak

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

Czy na nią trochę wczoraj, okazuje się, że jest to sposób na ucieczkę (:) i() tak:.

Tylko pola zawierającego (:) musi być uciekł z backticks

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