为啥 list 应该先转换为 RDD 再转换为 Dataframe?有啥方法可以将列表转换为数据框?
Posted
技术标签:
【中文标题】为啥 list 应该先转换为 RDD 再转换为 Dataframe?有啥方法可以将列表转换为数据框?【英文标题】:Why list should be converted to RDD and then Dataframe? is there any method to convert list to dataframe?为什么 list 应该先转换为 RDD 再转换为 Dataframe?有什么方法可以将列表转换为数据框? 【发布时间】:2021-09-28 03:08:54 【问题描述】:我是 spark 新手,我有一些简单的问题。 我想使用前缀跨度的方法,但它只支持数据集和数据框。 所以我确实将列表转换为rdd,然后将其转换为数据框。 但是为什么要先将 list 转换为 rdd 呢? 为什么list不能直接转dataframe?
data = [Row([[1, 2], [3]]), Row([[1], [3, 2], [2]]), Row([[1, 2], [5]]), Row([[6]])]
columns = ["seq"]
rdd = spark.sparkContext.parallelize(data)
df = spark.createDataFrame(data=data).toDF(*columns)
谢谢。
【问题讨论】:
这能回答你的问题吗? Manually create a pyspark dataframe 作为建议,当您想在问题/答案中添加一些代码时,将其添加为文本,以便更容易复制粘贴。 感谢您的评论,我编辑问题 【参考方案1】:不,您不需要先创建 RDD。
DataFrame 是 RDD 之上的抽象。 您可以从 RDD 或直接创建 DataFrame,如 here 所述:
df = spark.createDataFrame(
[
(1, "foo"), # create your data here, be consistent in the types.
(2, "bar"),
],
["id", "label"] # add your column names here
)
无论您如何创建 DataFrame,它仍然会有一个 .rdd
成员。
【讨论】:
【参考方案2】:我在这里复制问题中给出的代码。
data = [Row([[1, 2], [3]]), Row([[1], [3, 2], [2]]), Row([[1, 2], [5]])] # Line 1
columns = ["seq"] # Line 2
rdd = spark.sparkContext.parallelize(data) # Line 3
df = spark.createDataFrame(data).toDF(*columns) # Line 4 (removed .show())
在这里,我们没有在任何地方使用 rdd 变量,因此您实际上甚至不需要创建它。可以删除第 3 行,并且 df 仍然是相同的。这就是我们直接从列表中创建 DataFrame 的确切方式。您可能会经常看到另一种方式。
df = spark.createDataFrame(data, schema=columns)
这也将创建相同的 DataFrame。
【讨论】:
以上是关于为啥 list 应该先转换为 RDD 再转换为 Dataframe?有啥方法可以将列表转换为数据框?的主要内容,如果未能解决你的问题,请参考以下文章
使用对 [Key,Value From List1],[Key,ValueFrom List2] 将 RDD[Key,List[Value]] 转换为 RDD