我将交易作为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
答案 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))