разница во времени между строками для каждого пользователя - Pyspark Dataframe - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть CSV-файл со следующей структурой

USER_ID       location          timestamp          
 1             1001         19:11:39  5-2-2010
 1             6022         17:51:19  6-6-2010
 1             1041         11:11:39  5-2-2010
 2             9483         10:51:23  3-2-2012
 2             4532         11:11:11  4-5-2012
 3             4374         03:21:23  6-9-2013
 3             4334         04:53:13  4-5-2013

В основном то, что я хотел бы сделать с помощью pyspark или только python, - это вычисление разницы временных меток для другого местоположения с тем же номером user_id.Примером ожидаемого результата будет:

USER_ID       location          timestamp difference         
 1            1001-1041         08:00:00

любая идея, как найти решение

1 Ответ

0 голосов
/ 19 ноября 2018

Предполагая, что вы хотите получить любую возможную комбинацию местоположений для пользователя, вам просто нужно выполнить объединение по USER_ID, а затем вычесть столбцы даты.Единственная хитрость заключается в том, чтобы использовать unix_timestamp для анализа ваших данных даты и времени в целое число, которое поддерживает операцию вычитания.

Пример кода:

from pyspark.sql.functions import unix_timestamp, col, datediff

data = [
    (1, 1001, '19:11:39 5-2-2010'),
    (1, 6022, '17:51:19 6-6-2010'),
    (1, 1041, '11:11:39 5-2-2010'),
    (2, 9483, '10:51:23 3-2-2012'),
    (2, 4532, '11:11:11 4-5-2012'),
    (3, 4374, '03:21:23 6-9-2013'),
    (3, 4334, '04:53:13 4-5-2013')
]

df = spark.createDataFrame(data, ['USER_ID', 'location', 'timestamp'])
df = df.withColumn('timestamp', unix_timestamp('timestamp', 'HH:mm:ss dd-MM-yyyy'))

# Renaming columns to avoid conflicts after join
df2 = df.selectExpr('USER_ID as USER_ID2', 'location as location2', 'timestamp as timestamp2')
cartesian = df.join(df2, col("USER_ID") == col("USER_ID2"), "inner")

# Filter to get rid of reversed duplicates, and rows where location is same on both sides
pairs = cartesian.filter("location < location2") \
                 .drop("USER_ID2") \
                 .withColumn("diff", col("timestamp2") - col("timestamp"))
pairs.show()
...