基于列表标记Dataframe行

jpfvwuh4  于 2021-07-12  发布在  Spark
关注(0)|答案(1)|浏览(267)

我有一个sparkDataframe,由列组“g”和时间戳“t”组成。我有一个列表,它给出了一个特定组的时间范围。 [[a, 2, 4],[a, 5, 6],[b, 2, 4]] 我需要的是列“need”,它标记列表范围中定义的行。
完成这项任务最快的方法是什么?因为这项工作将运行在非常大的数据上。

G   T   Need
------------
a   1   
a   2   True
a   3   True
a   4   
a   5   True
a   6   True
a   7   
b   1   
b   2   True
b   3   True
b   4   True
ymzxtsji

ymzxtsji1#

您可以从列表中创建sparkDataframe,然后执行左联接:

import pyspark.sql.functions as F

times = [['a', 2, 3], ['a', 5, 6], ['b', 2, 4]]
times_df = spark.createDataFrame(times, ['G', 'T0', 'T1'])

result = df.join(
    times_df,
    (df['G'] == times_df['G']) & 
    df['T'].between(times_df['T0'], times_df['T1']),
    'left'
).select(
    df['*'],
    F.when(times_df['G'].isNotNull(), F.lit(True)).alias('need')
)

result.show()
+---+---+----+
|  G|  T|need|
+---+---+----+
|  b|  1|null|
|  b|  2|true|
|  b|  3|true|
|  b|  4|true|
|  a|  1|null|
|  a|  2|true|
|  a|  3|true|
|  a|  4|null|
|  a|  5|true|
|  a|  6|true|
|  a|  7|null|
+---+---+----+

相关问题