Apache spark Pyspark连接函数和时间戳之间的差异
我正在尝试使用用户事件连接两个表。当差异时间戳小于5s(5000ms)时,我想通过用户id(id)将表a与表b连接起来 以下是我正在做的: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
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、 非常感谢。