如何使用 SparkSession 从列表中创建数据框?

Posted

技术标签:

【中文标题】如何使用 SparkSession 从列表中创建数据框?【英文标题】:How to create a dataframe from a list using SparkSession? 【发布时间】:2018-03-20 16:32:09 【问题描述】:

我想创建一个 pyspark 数据框,其中一列包含一系列整数的指定名称(这是为了输入 ALS 模型的RecommendForUserSubset 方法)。

所以我使用范围创建了一个整数列表,并发现this question 展示了如何使用 SQLContext 将列表制作成数据框。但由于我使用的是 SparkSession API,而不是较旧的 API,我不知道如何创建 SQLContext——根据 SQLContext 上的documentation,我可能不必:“从 Spark 2.0 开始,这已被 SparkSession 取代。但是,我们将类保留在此处是为了向后兼容。”

这是我要替换的代码:

dataset = sqlContext.createDataFrame(range(i, i+1000), ['session_idx'])

我也不知道是否应该将整数列表映射到元组列表,或者它是否会“正常工作”。

【问题讨论】:

试图创建一个具有整数范围的列,我在第一句话中就说了。当我切换到在 spark 上调用 createDataFrame 时,上面确实给了我一个类型错误,我认为当我使用以下方法将它更改为元组列表时它会消失: [tuple(x) for x in range(i, i+ 1000)],但类型错误仍然存​​在。 “TypeError:无法推断类型的架构:”所以我不知道那里发生了什么。我改用 SparkSession 的 range 方法。 在下面查看我的答案,它应该可以澄清错误的含义 【参考方案1】:

在这种情况下,SparkSession 上存在相同的方法 (spark.createDataFrame)。

但是,对于获取范围列的特定用例,还有一种专用方法:

dataset = spark.range(i, i + 1000)
dataset = dataset.withColumnRenamed('id', 'user_idx')

【讨论】:

是的,在我回答完这个问题之前,我认为没有人会看到这个问题......我发布这个问题的目的是填补谷歌的空白,而不是真正获得帮助,因为“创建使用 sparksession pyspark 的列表中的数据框”并没有返回任何对我立即有用的东西,这是一个非常基本的问题,我认为每个人都不应该在刚接触 spark 时仔细阅读文档。【参考方案2】:
i=0
dataset = sqlContext.createDataFrame(range(i, i+10), ['session_idx'])

肯定会给你错误

TypeError:无法推断类型的架构:

错误是因为range(i, i+10) 必须如下,如 api 文档中所述

data:任何类型的 SQL 数据表示(例如行、元组、int、布尔值等)的 RDD,或 :class:list 或 :class:pandas.DataFrame

解决方案

只需将range(i, i+10) 列表设为

i=0
dataset = sqlContext.createDataFrame([range(i, i+10)], ['session_idx'])

这会给你

+-----------+---+---+---+---+---+---+---+---+---+
|session_idx|_2 |_3 |_4 |_5 |_6 |_7 |_8 |_9 |_10|
+-----------+---+---+---+---+---+---+---+---+---+
|0          |1  |2  |3  |4  |5  |6  |7  |8  |9  |
+-----------+---+---+---+---+---+---+---+---+---+

列表列表

i=0
dataset = sqlContext.createDataFrame([[range(i, i+10),]], ['session_idx'])

这会产生

+------------------------------+
|session_idx                   |
+------------------------------+
|[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]|
+------------------------------+

希望回答对你有帮助

【讨论】:

以上是关于如何使用 SparkSession 从列表中创建数据框?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 stream().reduce() 基于谓词从一个列表中创建 2 个列表 [重复]

如何从 Python 中不同长度的列表列表中创建数据框?

Swift Combine:如何从发布者列表中创建单个发布者?

如何从列表中创建唯一的非重复对组合

如何从键值对列表中创建 Spark Row

如何从字符串列表中创建一个字符串? [复制]