2017-03-09 5 views
1

Diese meine Daten:Kann nicht Spalte (numerische Spaltenname) in Funken lösen Dataframe

scala> data.printSchema 
root 
|-- 1.0: string (nullable = true) 
|-- 2.0: string (nullable = true) 
|-- 3.0: string (nullable = true) 

Das funktioniert nicht :(

scala> data.select("2.0").show 

Ausnahme:

org.apache.spark.sql.AnalysisException: cannot resolve '`2.0`' given input columns: [1.0, 2.0, 3.0];; 
'Project ['2.0] 
+- Project [_1#5608 AS 1.0#5615, _2#5609 AS 2.0#5616, _3#5610 AS 3.0#5617] 
    +- LocalRelation [_1#5608, _2#5609, _3#5610] 
     ... 

Try dies zu Hause (Ich laufe auf der Shell v_2.1.0.5)!

val data = spark.createDataFrame(Seq(
    ("Hello", ", ", "World!") 
)).toDF("1.0", "2.0", "3.0") 
data.select("2.0").show 

Antwort

2

können Sie backticks verwenden Sie den Punkt zu entkommen, die für den Zugriff auf Spalten für Strukturtyp reserviert ist:

data.select("`2.0`").show 
+---+ 
|2.0| 
+---+ 
| , | 
+---+ 
+2

Nur um klar zu sein, der Grund dafür ist, dass der Spaltenname eine Periode enthält. Spark ist im Allgemeinen ein kleiner Buggy, wenn es Backticks in der Codebase unterstützt, aber in diesem Fall geht es ihnen gut. – John

2

Das Problem ist, dass Sie nicht Punkt-Zeichen in den Spaltennamen hinzufügen können, während sie von Datenrahmen auswählen. Sie können sich diese Art von question, ähnlich sehen.

val data = spark.createDataFrame(Seq(
    ("Hello", ", ", "World!") 
)).toDF("1.0", "2.0", "3.0") 
data.select(sanitize("2.0")).show 

def sanitize(input: String): String = s"`$input`" 
Verwandte Themen