当前位置: 首页 > 面试题库 >

在PySpark 1.5.0中,如何基于列x的值列出列y的所有项目?

夏侯兴学
2023-03-14
问题内容

以下问题特定于PySpark 1.5.0版,因为新功能不断添加到PySpark。

如何根据列y的值列出列的所有项目x?例如:

rdd = sc.parallelize([ {'x': "foo", 'y': 1}, 
                  {'x': "foo", 'y': 1}, 
                  {'x': "bar", 'y': 10}, 
                 {'x': "bar", 'y': 2},
                 {'x': 'qux', 'y':999}])
df = sqlCtx.createDataFrame(rdd)
df.show()

+---+---+
|  x|  y|
+---+---+
|foo|  1|
|foo|  1|
|bar| 10|
|bar|  2|
|qux|999|
+---+---+

我想要类似的东西:

+---+--------+
|  x|  y     |
+---+--------+
|foo| [1, 1] |
|bar| [10, 2]|
|bar| [999]  |
+---+--------+

顺序无关紧要。在Pandas中,我可以通过以下方式来实现这一高贵的目标:

pd = df.toPandas()
pd.groupby('x')['y'].apply(list).reset_index()

但是,版本groupBy1.5.0中的聚合功能似乎非常有限。任何想法如何克服此限制?


问题答案:

您可以使用collect_listHive UDAF:

from pyspark.sql.functions import expr
from pyspark import HiveContext

sqlContext = HiveContext(sc)
df = sqlContext.createDataFrame(rdd)

df.groupBy("x").agg(expr("collect_list(y) AS y"))

在1.6或更高版本中,可以使用collect_list函数:

from pyspark.sql.functions import collect_list

df.groupBy("x").agg(collect_list(y).alias("y"))

在2.0或更高版本中,无需Hive支持即可使用它。

但是,这并不是特别有效的操作,因此您应适度使用它。

另外,请勿使用字典进行模式推断。从1.2开始不推荐使用



 类似资料:
  • 我很久以前就问过这个问题.... 有没有办法在Gradle中列出任务依赖关系?

  • 问题内容: SQL Server2005。我有一个带有ColumnA位,ColumnB int的表 我可以添加默认值,以便如果为1则为15,如果为0则为0? 我知道我可以用扳机做到这一点,但我的老板对扳机存有偏见(他需要扳机敏感性培训)。 问题答案: 如果您的ColumnB只能为15或零,则可以使其成为基于ColumnA的计算列。这是添加新的计算列的代码:

  • 我有一个现有的mysql表,有两列a和b。 现在我想在该表中添加一列c。 c应该是可空的,应该有一个默认值NULL,除了在b列的值为10的行中。其中b的值为10,c的值为X。 我知道使用SQL做这件事相当简单,但我想使用liquibase做这件事,因为我们在模式迁移中使用liquibase。

  • 我有一个简单的数据框架 我想删除所有有水果的行或 预期输出应如下所示: 我试图执行以下语法,但不知何故,它没有删除数据框中的所有行 有什么建议可以解决这个问题吗?

  • 问题内容: 所以,这是我的数据框 我还有另一个清单: 如果x.Country位于欧洲,我想创建一个新列“ Continent” 问题答案: 或者您可以直接 使用

  • 我在Dynamodb有一张这样的桌子 我想列出表中的所有数据,但不想对表执行扫描。所以我在表上添加了一个索引。它的值将始终相同(示例中的) 现在我可以使用查询表中的所有数据。它的好处是所有数据都将驻留在Dynamodb的GSI中的同一个分区中。我想知道这样做是否是个好主意?还是会导致GSI上的热分区?