为啥 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?有啥方法可以将列表转换为数据框?的主要内容,如果未能解决你的问题,请参考以下文章

将地图 RDD 转换为数据框

使用对 [Key,Value From List1],[Key,ValueFrom List2] 将 RDD[Key,List[Value]] 转换为 RDD

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

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

将 rdd 转换为 DF 列

将rdd转换为pairRDD