web-dev-qa-db-ja.com

spark-scala:org.Apache.spark.sql.Rowのメンバーではない

データフレームをRDDに変換してから、以下の操作を実行してタプルを返します。

df.rdd.map { t=>
 (t._2 + "_" + t._3 , t)
}.take(5)

次に、以下のエラーが発生しました。誰かアイデアはありますか?ありがとう!

<console>:37: error: value _2 is not a member of org.Apache.spark.sql.Row
               (t._2 + "_" + t._3 , t)
                  ^
7
Edamame

DataFrameをRDDに変換すると、RDD[Row]なので、mapを使用すると、関数はRowをパラメーターとして受け取ります。したがって、Rowメソッドを使用してそのメンバーにアクセスする必要があります(インデックスは0から始まることに注意してください)。

df.rdd.map { 
  row: Row => (row.getString(1) + "_" + row.getString(2), row)
}.take(5)

Spark scaladoc で、より多くの例を表示し、Rowオブジェクトで使用可能なすべてのメソッドを確認できます。

編集:この操作を行う理由はわかりませんが、DataFrameの文字列列を連結するには、次のオプションを検討できます。

import org.Apache.spark.sql.functions._
val newDF = df.withColumn("concat", concat(df("col2"), lit("_"), df("col3")))
11
Daniel de Paula

ListまたはArrayであるかのように Row のすべての要素にアクセスできます。つまり、(index)を使用することを意味しますが、メソッドgetも使用できます。

例えば:

df.rdd.map {t =>
  (t(2).toString + "_" + t(3).toString, t)
}.take(5)
7