Apache spark Pyspark连接函数和时间戳之间的差异

Apache spark Pyspark连接函数和时间戳之间的差异,apache-spark,join,pyspark,databricks,pyspark-dataframes,Apache Spark,Join,Pyspark,Databricks,Pyspark Dataframes,我正在尝试使用用户事件连接两个表。当差异时间戳小于5s(5000ms)时,我想通过用户id(id)将表a与表b连接起来 以下是我正在做的: 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.isNotN

我正在尝试使用用户事件连接两个表。当差异时间戳小于5s(5000ms)时,我想通过用户id(id)将表a与表b连接起来

以下是我正在做的:

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'
  )
) 
表a=(
表a
.加入(
表b,
table_a.uid==table_b.uid
&abs(表b.b\U时间戳-表a.a\U时间戳)<5000
&表a.a\u timestamp.isNotNull()
,
how=‘left’
)
) 
我有两个错误:

错误1)
ValueError:无法将列转换为布尔值:在构建数据帧布尔表达式时,请使用“&”表示“and”,使用“|”表示“or”,使用“~”表示“not”。

如果删除联接上的第2个条件并只保留第1个和第3个条件,则出现错误2:
org.apache.spark.sql.AnalysisException:无法解析';(
uid
和(
a_时间戳
不为空))&39;由于数据类型不匹配:在';(
uid
和(
a_时间戳
不为空))&39;(字符串和布尔值)


非常感谢您的帮助

您只需要在每个过滤条件周围加上括号。例如,以下工作:

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=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.
df1.join(
df2,
df1.id==df2.id
&abs(df1.val-df2.val)<5
).show()
#ValueError:无法将列转换为布尔值:在构建数据帧布尔表达式时,请使用“&”表示“and”,使用“|”表示“or”,使用“~”表示“not”。

您的条件需要附加说明(例如,(条件1)和(条件2)和..)对于PyScac来说,这是一个常见的问题。对于第二个错误,你应该考虑首先用0个值填充NA,在第二个条件下解析你的两个时间戳值为双、十进制、整数或任何相同的。然后,你可以只使用不等于零的最后一个条件。钉住它!e、 非常感谢。