使用 group by 时在 Spark 中保留未使用的列?

atd*_*y17 5 apache-spark pyspark

所以我有一个用户名数据框,他们发布了哪些线程以及这些帖子的时间戳。如果弄清楚谁是线程的第一个用户以及时间,我想要做什么。我知道要弄清楚第一篇文章是在一个线程上做一个小组,然后在时间戳上做一个分钟。但这会删除用户名。我如何使用 group by 并保留用户名?

Rya*_*ier 2

您可以使用 HiveContext 和 Hive name_struct 函数通过一个 groupBy 来完成此操作。技巧是 min 将通过按从左到右的顺序评估列来处理结构,并且仅在当前列相等时才移动到下一个。因此,在这种情况下,它实际上只是比较时间戳列,但是通过创建一个包含名称的结构,您将可以在 min 函数吐出结果后访问该名称。

data = [
    ('user', 'thread', 'ts'),
    ('ryan', 1, 1234),
    ('bob', 1, 2345),
    ('bob', 2, 1234),
    ('john', 2, 2223)
]

header = data[0]
rdd = sc.parallelize(data[1:])
df = sqlContext.createDataFrame(rdd, header)
df.registerTempTable('table')

sql = """
SELECT thread, min(named_struct('ts', ts, 'user', user)) as earliest
FROM table
GROUP BY thread
"""

grouped = sqlContext.sql(sql)
final = grouped.selectExpr('thread', 'earliest.user as user', 'earliest.ts as timestamp')
Run Code Online (Sandbox Code Playgroud)