无法解析Spark Dataframe中的列(数字列名称)

Mar*_*ace 7 scala apache-spark spark-dataframe

这是我的数据:

scala> data.printSchema
root
 |-- 1.0: string (nullable = true)
 |-- 2.0: string (nullable = true)
 |-- 3.0: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)

这不起作用:(

scala> data.select("2.0").show
Run Code Online (Sandbox Code Playgroud)

例外:

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]
        ...
Run Code Online (Sandbox Code Playgroud)

在家尝试一下(我正在外壳程序v_2.1.0.5上运行)!

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

Psi*_*dom 10

您可以使用反引号对点进行转义,该点保留用于访问结构类型的列:

data.select("`2.0`").show
+---+
|2.0|
+---+
| , |
+---+
Run Code Online (Sandbox Code Playgroud)

  • 只需清楚一点,其原因是列名中带有句点。就适当地在整个代码库中支持反引号而言,Spark通常来说是一个小bug。但是在这种情况下,它们很好。 (6认同)

Taw*_*kir 5

问题是从数据框中选择时无法在列名中添加点字符。你可以看看这个问题的一种类似。

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`"
Run Code Online (Sandbox Code Playgroud)