我正在使用Zeppelin 0.6.2和Spark 2.0。
我正在尝试在循环内执行查询,但效果不是很好。
我需要为数据帧的每一行循环,大约5000行并执行一个查询,该查询将增加另一个数据帧中的值。
这是我的尝试:
val t2 = time
t2.registerTempTable("t2")
u.collect().foreach{ r =>
println(r(0))
val c=r(1)
val start="\""+r(2)+"\""
val end="\""+r(3)+"\""
sql("INSERT INTO TABLE t2 SELECT time, recordings + "+c+" AS recordings FROM time WHERE time >= " + start + " AND time < " + end)
}
我尝试了两个数据帧中的一小部分,但它仍然很慢。我觉得我做得不对。
知道如何快速更新数据框吗?
答案 0 :(得分:1)
我需要为数据帧的每一行循环,大约5000行并执行一个查询,该查询将增加另一个数据帧中的值。
我可以发现u
,time
和t2
个表格。 t2
将别名为time
,以便您稍后可以在INSERT
查询中使用它。正确?
PROTIP:我很高兴有他们的架构。
假设您有一个名为df5k
的5000行数据框:
// it's a fake 5k = a mere 5 rows for the sake of simplicity
// I think `u` is your 5k table (that you unnecessarily `collect` to `foreach`)
val u = Seq(
(0, 0, 0, 3),
(1, 3, 4, 5),
(2, 6, 6, 8),
(3, 9, 9, 17)).toDF("id", "c", "start", "end")
// I think `t2` is an alias for `time` and you want to update `t2`
val time = Seq(
(1, 10),
(4, 40),
(9, 90)).toDF("time", "recordings")
// this is the calculation of the new records
val new_t2 = u.join(time)
.where('time >= 'start)
.where('time < 'end)
.withColumn("recordings + c", 'recordings + 'c)
.select('time, $"recordings + c" as 'recordings)
// the following is an equivalent of INSERT INTO using Dataset API
val solution = time.union(new_t2)
注意:您没有更新DataFrame,而是使用新值创建新的DataFrame。