2016-12-10 8 views
4

Wenn ich Datenframes auf Spark-Shell (Version 1.6) abfragen, sind die Spaltennamen Groß-und Kleinschreibung. Auf Funken ShellSpark DataFrame

val a = sqlContext.read.parquet("<my-location>") 
    a.filter($"name" <=> "andrew").count() 
    a.filter($"NamE" <=> "andrew").count() 

Sowohl die obigen Ergebnisse gibt mir das Recht, zu zählen. Aber wenn ich dies in einem Glas bauen und laufen über „funken einreichen“, unter Code nicht sagen Name nicht existiert, da zugrunde liegenden Parkett Daten mit Spalte als „name“

gespeichert wurde

schlägt fehl:

a.filter($"NamE" <=> "andrew").count() 

Pass:

a.filter($"name" <=> "andrew").count() 

Bin ich hier etwas fehlt, ist es eine Möglichkeit, ich es Groß- und Kleinschreibung machen. Ich weiß, ich kann eine Auswahl vor dem Filtern verwenden und alle Spalten als Kleinbuchstaben Alias ​​machen, aber wollte wissen, warum es anders verhält.

Antwort

6

Es ist ein bisschen hier heikel: die einfache Antwort ist, weil Sie denken, Sie verwenden die gleiche SQLContext in beiden Fällen, wenn Sie eigentlich nicht sind. In Funken Schale wird ein SqlContext für Sie erstellt haben, aber es ist eigentlich ein HiveContext:

scala> sqlContext.getClass res3: Class[_ <: org.apache.spark.sql.SQLContext] = class org.apache.spark.sql.hive.HiveContext

und in Ihrer Funken einreichen, haben Sie wahrscheinlich eine einfache SQLContext verwenden. Laut @ LostInOverflow Link: Hive is case insensitive, while Parquet is not, so meine Vermutung ist die folgende: mit einem HiveContext verwenden Sie wahrscheinlich einige Code mit Hive verbunden, um Ihre Parquet Daten herunterladen. Hive ist case insensitive, es funktioniert gut. Mit einem einfachen SQLContext, es ist nicht das erwartete Verhalten.

+2

Verwenden von HiveContext anstelle von SQLContext aufgelöst this.Auch wenn Sie SQLContext verwenden möchten, können wir sqlContext.setConf ("spark.sql.caseSensitive", "false") verwenden, so dass es Groß-und Kleinschreibung wird – ftw

+0

Wusste nicht für die '' 'sqlContext.setConf (" spark.sql.caseSensitive "," false ")' '', nett. –

6

The part you're missing:

... ist unempfindlich Fall, während Parkett nicht

ist

Sie können versuchen:

val b = df.toDF(df.columns.map(_.toLowerCase): _*) 
b.filter(...) 
+0

Warum funktioniert es, wenn ich gleiche Parkett Daten über Funken Shell abfragen? – ftw

+0

Ich habe keine Ahnung. –

1

Versuchen Sie, die Groß-/Kleinschreibung mit sqlContext explizit zu steuern. Deaktivieren Sie die Groß-/Kleinschreibung, indem Sie die untere Anweisung verwenden, und prüfen Sie, ob es hilfreich ist.

sqlContext.sql("set spark.sql.caseSensitive=false")