我想知道火花如何处理这些情况,什么将是更快和更好的使用。从dataframe中获得更好的本机计数,还是在spark中进行计数?这不仅关系到我认为的伯爵。
hc = HiveContext(sc)
t0 = time()
a = hc.table('default.testtable')
c = a.count()
tt = time() - t0
print(c)
print("Count for 1st case completed in {} seconds".format(round(tt,3)))
t0 = time()
b = hc.sql('select count(*) from default.testtable')
c1 = b.collect()
tt = time() - t0
print(c1)
print("Count for 2nd case completed in {} seconds".format(round(tt,3)))如果我在单运行中执行它,它会给出:
77707920
Count for 1st case completed in 48.358 seconds
[Row(_c0=77707920)]
Count for 2nd case completed in 20.895 seconds如果我单独执行,在注释第2次然后是第1次块之前,那么第1次甚至更快:
77707920
Count for 1st case completed in 18.717 seconds
[Row(_c0=77707920)]
Count for 2nd case completed in 19.074 seconds两者的实际计划是相似的:
为收取:
== Physical Plan ==
TungstenAggregate(key=[], functions=[(count(1),mode=Final,isDistinct=false)], output=[_c0#9L])
+- TungstenExchange SinglePartition, None
+- TungstenAggregate(key=[], functions=[(count(1),mode=Partial,isDistinct=false)], output=[count#12L])
+- HiveTableScan MetastoreRelation default, testtable, None数数:
== Physical Plan ==
TungstenAggregate(key=[], functions=[(count(1),mode=Final,isDistinct=false)], output=[count#9L])
+- TungstenExchange SinglePartition, None
+- TungstenAggregate(key=[], functions=[(count(1),mode=Partial,isDistinct=false)], output=[count#12L])
+- HiveTableScan MetastoreRelation default, testtable, None星火如何看待它的内在?为什么性能结果是不同的?哪个本机数据数据计数或火花sql计数更适合使用?
发布于 2018-01-25 11:48:12
没有什么不同。在第一种情况下,你的测量是错误的。
如果您反转顺序,您将看到时间是相反的,sql比table快。
您还可以看到一些JVM和系统优化的结果,可以通过重复执行来提高性能。
如果您想获得可靠的估计值,请分别为每个场景运行程序,并在timeit中多次重复计时。
https://stackoverflow.com/questions/48442024
复制相似问题