如何将 Array[Row] 转换为 RDD[Row]

Posted

技术标签:

【中文标题】如何将 Array[Row] 转换为 RDD[Row]【英文标题】:How do I convert Array[Row] to RDD[Row] 【发布时间】:2017-06-17 17:55:49 【问题描述】:

我有一个场景,我想将格式为 Array[Row] 的数据帧的结果转换为 RDD[Row]。我尝试过使用并行化,但我不想使用它,因为它需要在单个系统中包含整个数据,这在生产环境中是不可行的。

val Bid = spark.sql("select Distinct DeviceId, ButtonName  from stb").collect()
val bidrdd = sparkContext.parallelize(Bid)

我如何实现这一目标?我尝试了此链接 (How to convert DataFrame to RDD in Scala?) 中给出的方法,但它对我不起作用。

val bidrdd1 = Bid.map(x => (x(0).toString, x(1).toString)).rdd

它给出了一个错误value rdd is not a member of Array[(String, String)]

【问题讨论】:

【参考方案1】:

您在此处创建的变量Bid 不是 DataFrame,它是Array[Row],这就是您不能在其上使用.rdd 的原因。如果您想获得RDD[Row],只需在DataFrame 上调用.rdd(无需调用collect):

val rdd = spark.sql("select Distinct DeviceId, ButtonName  from stb").rdd

您的帖子包含一些值得注意的误解:

... 格式为 Array[Row] ...

的数据帧

不完全是 - Array[Row] 是从 DataFrame 收集数据到驱动程序内存的结果 - 它不是 DataFrame。

...我不想使用它,因为它需要在单个系统中包含整个数据...

请注意,一旦您在 DataFrame 上使用 collect,您就已经将整个数据收集到了单个 JVM 的内存中。所以使用parallelize 不是问题。

【讨论】:

感谢 Tzach,它成功了。目前我正在处理测试数据,所以我使用了收集。最终代码将包含将结果保存到平面文件。 使用 collect 进行测试是有用且合适的,但请确保将测试与实际代码分开 - collect 返回一个完全不同的类型,不能像 collect 一样使用t 调用。

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

如何将 cassandraRow 转换为 Row(apache spark)?

将嵌入在 Dataframe 中的 Row RDD 转换为 List

如何在火花中将rdd对象转换为数据框

Spark:将 RDD[(Long, Array[Double])] 转换为 RDD[(Long, Long, Double)]

Pyspark 将 RowMatrix 转换为 DataFrame 或 RDD

如何将三个 RDD 加入一个元组?