Spark:如何将数据帧Array [String]更改为RDD [Array [String]]

时间:2017-01-11 09:54:39

标签: arrays scala apache-spark

我将交易作为DataFrame array<string>

transactions: org.apache.spark.sql.DataFrame = [collect_set(b): array<string>]

我想将其更改为RDD[Array[string]],但当我将其更改为RDD时,它会更改为org.apache.spark.rdd.RDD[org.apache.spark.sql.Row]

val sam: RDD[Array[String]] = transactions.rdd
<console>:42: error: type mismatch;
 found   : org.apache.spark.rdd.RDD[org.apache.spark.sql.Row]
 required: org.apache.spark.rdd.RDD[Array[String]]
       val sam: RDD[Array[String]] = transactions.rdd

2 个答案:

答案 0 :(得分:2)

transactions.rdd将返回RDD[Row],就像它在消息中一样。

您可以手动将Row转换为数组:

val sam = transactions.rdd.map(x => x.getList(0).toArray.map(_.toString))

更多Spark 2.0风格:

val sam = transactions.select("columnName").as[Array[String]].rdd

将columnName替换为DataFrame中正确的列名 - 可能您应该将collect_set(b)重命名为更友好的用户名

答案 1 :(得分:1)

Dataframe实际上是一个数组[Row],因此无论何时在数据帧上运行collect,它都会创建一个数组[Row],当你转换它时,它会变成RDD [Row]。

因此,如果您想要RDD [Array [String]],您可以这样做:

val sam = transactions.rdd.map(x => x.toString().stripPrefix("[").stripSuffix("]").split(fieldSeperator))