如何将 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
Spark:将 RDD[(Long, Array[Double])] 转换为 RDD[(Long, Long, Double)]