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函数之前使用stripPrefixstripSuffix函数。

【讨论】:

我也很抱歉我错过了 split ,在你的建议拆分后,我得到括号 [ 本身带有刺痛 [onetwo] @Toren 要获取没有“[”和“]”的数据,我们可以使用 stripPrefix 和 stripSuffix 函数。已更新代码。

以上是关于DataFrame:将列内的数组转换为 RDD[Array[String]]的主要内容,如果未能解决你的问题,请参考以下文章

将列内包含 JSON 数组的行扩展为多行

RDD转换为DataFrame

熊猫列内的映射值

拆分python中不同列中列内的字典列表

如何在 Scala 中将 RDD 转换为二维数组?

将 DataFrame 转换为 RDD 并将 RDD 动态拆分为与 DataFrame 相同数量的 Columns