DataFrame:将列内的数组转换为 RDD[Array[String]]
Posted
技术标签:
【中文标题】DataFrame:将列内的数组转换为 RDD[Array[String]]【英文标题】:DataFrame : Convert array inside a column to RDD[Array[String]] 【发布时间】:2017-01-29 14:37:21 【问题描述】:给定一个数据框:
+---+----------+
|key| value|
+---+----------+
|foo| bar|
|bar| one, two|
+---+----------+
然后我想使用 value 列作为 FPGrowth 的条目,它必须看起来像 RDD[Array[String]]
val transactions: RDD[Array[String]] = df.select("value").rdd.map(x => x.getList(0).toArray.map(_.toString))
import org.apache.spark.mllib.fpm.FPGrowth, FPGrowthModel
val fpg = new FPGrowth().setMinSupport(0.01)
val model = fpg.run(transactions)
我得到异常:
org.apache.spark.SparkException: Job aborted due to stage failure: Task 7 in stage 141.0 failed 1 times, most recent failure: Lost task 7.0 in stage 141.0 (TID 2232, localhost): java.lang.ClassCastException: java.lang.String cannot be cast to scala.collection.Seq
欢迎提出任何建议!
【问题讨论】:
问题:df.select("value").rdd.map(x => x.getList(0)...
,因为x
是字符串,所以应该是x.getString(0)
1) .getString(0)
将序列更改为 Char org.apache.spark.SparkException: Items in a transaction must be unique but got WrappedArray(o, n, e, ,, t, w, o).
的序列 2) 问题是异常,我不明白为什么
你试过了吗..val transactions =df.select("value").rdd.map(_.toString.split(","))
transactions: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[23] at map at <console>:35
。可能这应该作为它返回RDD[Array[String]]
【参考方案1】:
而不是
val transactions: RDD[Array[String]] = df.select("value").rdd.map(x => x.getList(0).toArray.map(_.toString))
尝试使用
val transactions= df.select("value").rdd.map(_.toString.stripPrefix("[").stripSuffix("]").split(","))
它提供了预期的输出,即RDD[Array[String]]
val transactions= df.select("value").rdd.map(_.toString.stripPrefix("[").stripSuffix("]").split(","))
transactions: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[10] at map at <console>:33
scala> transactions.take(2)
res21: Array[Array[String]] = Array(Array(bar), Array(one, two))
要删除“[”和“]”,可以在split
函数之前使用stripPrefix
和stripSuffix
函数。
【讨论】:
我也很抱歉我错过了split
,在你的建议拆分后,我得到括号 [
本身带有刺痛 [one
或 two]
@Toren 要获取没有“[”和“]”的数据,我们可以使用 stripPrefix 和 stripSuffix 函数。已更新代码。以上是关于DataFrame:将列内的数组转换为 RDD[Array[String]]的主要内容,如果未能解决你的问题,请参考以下文章