我想知道火花如何处理这些情况以及使用哪种情况会更快更好。什么是来自dataframe的更好的本机计数,或者在spark sql中计数?它不仅涉及我假设的计数。
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
如果我执行单独,则在评论第二个然后第一个块之前,然后第一个更快:
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
Spark如何对待它? 为什么表现结果不同? 哪个原生数据帧计数或spark sql计数更好用?
答案 0 :(得分:2)
没有区别。在第一种情况下你的测量结果是错误的。
如果您颠倒顺序,您应该会看到时间相反,sql
比table
快。
由于某些JVM和系统优化,您可能还会看到一些性能的改进。
如果您想获得可靠的估算,请分别为每个方案运行程序,并使用timeit
多次重复计时。