我有一个场景,我想将格式为Array [Row]的数据帧的结果转换为RDD [Row]。我尝试过使用parallelize,但我不想使用它,因为它需要在单个系统中包含整个数据,这在生产箱中是不可行的。
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)]
答案 0 :(得分:2)
您在此处创建的变量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
不是问题。