Pyspark объединяет функции и разницу между временными метками - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь объединить 2 таблицы с пользовательскими событиями. Я хочу объединить table_a с table_b по user_id (id) и когда временные метки разницы меньше 5 с (5000 мс).

Вот что я делаю:

table_a = (
  table_a
  .join(
  table_b,
    table_a.uid == table_b.uid 
     & abs(table_b.b_timestamp - table_a.a_timestamp) < 5000 
     & table_a.a_timestamp.isNotNull()
  ,
  how = 'left'
  )
) 

Я получаю 2 ошибки:

Ошибка 1) ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.

Ошибка 2, если я удаляю 2-е условие в соединении и оставляю только 1-е и 3-е: org.apache.spark.sql.AnalysisException: cannot resolve &#39;( uid AND ( a_timestamp IS NOT NULL))&#39; due to data type mismatch: differing types in &#39;( uid AND ( a_timestamp IS NOT NULL))&#39; (string and boolean).;;

Любая помощь очень ценится!

1 Ответ

1 голос
/ 13 апреля 2020

Вам нужны круглые скобки вокруг каждого условия фильтрации. Например, следующие работы:

df1 = spark.createDataFrame([
    (1, 20),
    (1, 21),
    (1, 25),
    (1, 30),
    (2, 21),
], ['id', 'val'])

df2 = spark.createDataFrame([
    (1, 21),
    (2, 30),
], ['id', 'val'])

df1.join(
    df2, 
    (df1.id == df2.id) 
    & (abs(df1.val - df2.val) < 5)
).show()
# +---+---+---+---+
# | id|val| id|val|
# +---+---+---+---+
# |  1| 20|  1| 21|
# |  1| 21|  1| 21|
# |  1| 25|  1| 21|
# +---+---+---+---+

Но без символов:

df1.join(
    df2, 
    df1.id == df2.id
    & abs(df1.val - df2.val) < 5
).show()
# ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.
...