Apache spark 对窗口函数进行平均会导致堆栈溢出错误
我试图通过使用窗口函数来确定数据帧列中日期之间的平均时间间隔。但是,具体化数据帧会引发Java异常 考虑以下示例:Apache spark 对窗口函数进行平均会导致堆栈溢出错误,apache-spark,pyspark,apache-spark-sql,pyspark-sql,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Sql,我试图通过使用窗口函数来确定数据帧列中日期之间的平均时间间隔。但是,具体化数据帧会引发Java异常 考虑以下示例: 从pyspark导入SparkContext 从pyspark.sql导入HiveContext、窗口、函数 从日期时间导入日期时间 sc=SparkContext() sq=HiveContext(sc) 数据=[ [日期时间(2014,1,1)], [日期时间(2014年2月1日)], [日期时间(2014,3,1)], [日期时间(2014,3,6)], [日期时间(2014
从pyspark导入SparkContext
从pyspark.sql导入HiveContext、窗口、函数
从日期时间导入日期时间
sc=SparkContext()
sq=HiveContext(sc)
数据=[
[日期时间(2014,1,1)],
[日期时间(2014年2月1日)],
[日期时间(2014,3,1)],
[日期时间(2014,3,6)],
[日期时间(2014年8月23日)],
[日期时间(2014年10月1日)],
]
df=sq.createDataFrame(数据,模式=['ts'])
ts=functions.col('ts')
w=Window.orderBy(ts)
diff=functions.datediff(
ts,
函数。滞后(ts,计数=1)。超过(w)
)
avg_diff=函数。avg(diff)
而df.select(diff.alias('diff')).show()正确呈现为
+----+
|差异|
+----+
|空的|
| 31|
| 28|
| 5|
| 170|
| 39|
+----+
执行df.select(avg_diff).show()
会给出一个java.lang.StackOverflowerError
我认为这应该行得通是错的吗?如果是这样的话,我做错了什么?我能做些什么
我正在Spark 1.6上使用Python API
当我执行df2=df时,选择(diff.alias('diff'))
,然后执行
df2.select(functions.avg('diff'))
没有错误。不幸的是,在我当前的设置中,这不是一个选项。它看起来像Catalyst中的一个bug,但是。链接方法应该可以正常工作:
df.select(diff.alias('diff')).agg(functions.avg('diff'))
不过,我在这里会小心的。窗口函数不应用于执行全局(无按
子句划分)操作。它们将所有数据移动到单个分区并执行顺序扫描。在这里使用RDD可能是一个更好的选择。在我的实际应用程序中,我会按某个键对窗口进行分区,然后在groupby
中使用聚合。如果我为后续的df.groupby(key.agg(avg_diff)
将窗口定义为window.partitionby(key.orderby(ts)
,事情应该会好起来,对吗?尽管事实上这仍然会抛出错误。是的,它应该是可以的。