2017-03-09 44 views
1

这是我的数据:无法解析Spark中列(数字列名)数据帧

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

这不工作:(

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

例外:

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] 
     ... 

尝试这在家里(我在外壳v_2.1.0.5上运行)!

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

回答

2

您可以使用backticks逃脱点,这是留给访问列的结构类型:

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

只是要清楚,其原因是列名有一段时间。在整个代码库中正确支持反引号,Spark通常是一个小bug,但在这种情况下,它们很好。 – John

2

问题是你不能在列名加点字,同时从数据框中选择。你可以看看这个question,有点类似。

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`"