3

私はScalaのスパーク2.0.1でピボット後multitple列を集約しようとしています:選択欄Scalaの

scala> val df = List((1, 2, 3, None), (1, 3, 4, Some(1))).toDF("a", "b", "c", "d") 
df: org.apache.spark.sql.DataFrame = [a: int, b: int ... 2 more fields] 

scala> df.show 
+---+---+---+----+ 
| a| b| c| d| 
+---+---+---+----+ 
| 1| 2| 3|null| 
| 1| 3| 4| 1| 
+---+---+---+----+ 

scala> val pivoted = df.groupBy("a").pivot("b").agg(max("c"), max("d")) 
pivoted: org.apache.spark.sql.DataFrame = [a: int, 2_max(`c`): int ... 3 more fields] 

scala> pivoted.show 
+---+----------+----------+----------+----------+ 
| a|2_max(`c`)|2_max(`d`)|3_max(`c`)|3_max(`d`)| 
+---+----------+----------+----------+----------+ 
| 1|   3|  null|   4|   1| 
+---+----------+----------+----------+----------+ 

私はそれらの列を選択するか、名前を変更することができません遠く:

scala> pivoted.select("3_max(`d`)") 
org.apache.spark.sql.AnalysisException: syntax error in attribute name: 3_max(`d`); 

scala> pivoted.select("`3_max(`d`)`") 
org.apache.spark.sql.AnalysisException: syntax error in attribute name: `3_max(`d`)`; 

scala> pivoted.select("`3_max(d)`") 
org.apache.spark.sql.AnalysisException: cannot resolve '`3_max(d)`' given input columns: [2_max(`c`), 3_max(`d`), a, 2_max(`d`), 3_max(`c`)]; 

ここには簡単なテクニックが必要ですか?ありがとう。

答えて

0

バグのようですが、バックティックが問題の原因です。ここで一つ問題を修正する修正プログラムをバックに列名からダニ削除するには、次のようになります。

val pivotedNewName = pivoted.columns.foldLeft(pivoted)((df, col) => 
          df.withColumnRenamed(col, col.replace("`", ""))) 

今、あなたは、通常通り、列名によって選択することができます。

pivotedNewName.select("2_max(c)").show 
+--------+ 
|2_max(c)| 
+--------+ 
|  3| 
+--------+ 
+0

これは、HTTPSに関連している://issues.apache。 org/jira/browse/SPARK-18502 – user1933178

関連する問題