不能传入一个df,udf中使用另一个udf,这将抛出一个错误TypeError: cannot pickle '_thread.RLock' object
解决:使用join的大于小于过滤条件
df1.join(df2, on=[(df2.timestamp > df1.start) & (df2.timestamp < df1.end)]) .groupby('start', 'end', 'event_name') .agg(F.mean('measurement').alias('avg')) .show()
问题:pysaprk struct类型作为key的map不能转成dict的key
python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可哈希的。可哈希表示key必须是不可变类型,如:数字、字符串、元组。
字典(dictionary)是除列表意外python之中最灵活的内置数据结构类型。列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
PickleException: expected zero arguments for construction of ClassDict for pyspark.sql.dtypes._create_row
貌似是由于返回值中包含了numpy.dtype,但是我没有使用,不知道为啥报错。好像是因为类型是map?
解决:转换成str类型在进行处理或者explore展开处理
from pyspark.sql import Row
>>> eDF = spark.createDataframe([Row(a=1, intlist=[1,2,3], mapfield={"a": "b"})])
>>> eDF.select(explode(eDF.intlist).alias("anInt")).collect()
[Row(anInt=1), Row(anInt=2), Row(anInt=3)]
>>> eDF.select(explode(eDF.mapfield).alias("key", "value")).show()
+---+-----+
|key|value|
+---+-----+
| a| b|
+---+-----+



