如何计算RDD联接(Spark)后元素有两个相同字段的次数

2024-07-03 06:13:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我从两个RDD开始,一个带有userID,然后是“SHL..”,还有一个带有userID和其他信息

因此,在将两个RDD连接在一起之后,我现在有了以下格式的数据:

(u'5839477', (u'SHL UNRESTRICTED',(u'AGBAMA,JAMES', u'MEDALLION TAXI DRIVER',u'12/27/2020', u'08/22/2019', u'13:20')))]

第一个字段是userID,第二个字段是关于它们的信息。我需要看看 有多少用户同时拥有“SHL UNRESTRICTED”和“MEDALLION TAXI DRIVER”。我想我应该在.join之后格式化数据。我遇到的问题是能够访问第二个字段中的特定字段


Tags: 数据用户信息格式driverjoinrdduserid
1条回答
网友
1楼 · 发布于 2024-07-03 06:13:03

使用自Spark 1.6以来引入的数据帧将更容易表达这一点。你使用RDD有什么特别的原因吗

如果不是,从一开始就开始使用数据帧,或者通过指定模式将现有RDD转换为数据帧。像这样:

>>> rdd = spark.sparkContext.parallelize([("5839477", ("SHL UNRESTRICTED", (u'AGBAMA,JAMES', u'MEDALLION TAXI DRIVER',u'12/27/2020', u'08/22/2019', u'13:20')))])
>>> from pyspark.sql.types import *
>>> schema = StructType([
...   StructField("user_id", StringType(), True),
...   StructField("details", StructType([
...     StructField("restrictions", StringType(), True),
...     StructField("more_details", StructType([
...       StructField("name", StringType(), True),
...       StructField("function", StringType(), True),
...       StructField("date1", StringType(), True),
...       StructField("date2", StringType(), True),
...       StructField("time_of_day", StringType(), True)
...     ]), True) ]), True)])
...
>>> df = rdd.toDF(schema=schema)
>>> df.filter(
...   (df.details.restrictions == "SHL UNRESTRICTED")
...   & (df.details.more_details.function == "MEDALLION TAXI DRIVER")
... ).count()
...
1

另外,您可以考虑将结构展平,这样就不需要在嵌套的列中进行挖掘

或者,如果您真的必须使用RDD,那么您可以像访问嵌套集合一样访问元素:

>>> rdd.filter(lambda x: (x[1][0] == "SHL UNRESTRICTED")
... and (x[1][1][1] == "MEDALLION TAXI DRIVER")
... ).count()
...
1

请注意,这段代码的表现力要差得多(对代码的读者来说,x[1][1][1]有什么意义?)。我绝对建议您在数据结构中添加名称

相关问题 更多 >