Pyspark HiveContext.table和HiveContext.sql性能

时间:2018-01-25 11:41:48

标签: python apache-spark dataframe pyspark

我想知道火花如何处理这些情况以及使用哪种情况会更快更好。什么是来自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计数更好用?

1 个答案:

答案 0 :(得分:2)

没有区别。在第一种情况下你的测量结果是错误的。

  • 第一个时间块包括上下文初始化时间,执行器分配时间和一堆其他辅助任务。
  • 当一切准备就绪时,第二次出现。

如果您颠倒顺序,您应该会看到时间相反,sqltable快。

由于某些JVM和系统优化,您可能还会看到一些性能的改进。

如果您想获得可靠的估算,请分别为每个方案运行程序,并使用timeit多次重复计时。