Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 对窗口函数进行平均会导致堆栈溢出错误_Apache Spark_Pyspark_Apache Spark Sql_Pyspark Sql - Fatal编程技术网

Apache spark 对窗口函数进行平均会导致堆栈溢出错误

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

我试图通过使用窗口函数来确定数据帧列中日期之间的平均时间间隔。但是,具体化数据帧会引发Java异常

考虑以下示例:

从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)
,事情应该会好起来,对吗?尽管事实上这仍然会抛出错误。是的,它应该是可以的。