udf使用:
问题:
不能传入一个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| +---+-----+
处理未成功:将map的key转换成str作为新字典的key,总是报字典的key_error。更改了生成的map_key。好像是没有获取到相应的key的问题。。。
UDF实在是太难调试了,跑一遍要好久,看不出错在哪。。。