Pyspark sql count 返回的行数与纯 sql 不同

Ale*_*ioG 1 hive apache-spark pyspark pyspark-sql

我已经开始在我的一个项目中使用 pyspark。我正在测试不同的命令来探索库的功能,但我发现了一些我不明白的东西。

拿这个代码:

from pyspark import SparkContext
from pyspark.sql import HiveContext
from pyspark.sql.dataframe import Dataframe

sc = SparkContext(sc)
hc = HiveContext(sc)

hc.sql("use test_schema")
hc.table("diamonds").count()
Run Code Online (Sandbox Code Playgroud)

最后一次count()操作返回 53941 条记录。如果我改为Hive 中的钻石中运行select count(*)我得到 53940。

pyspark 计数是否包括标题?

我试图调查:

df = hc.sql("select * from diamonds").collect()
df[0]
df[1]
Run Code Online (Sandbox Code Playgroud)

查看是否包含标题:

df[0] --> Row(carat=None, cut='cut', color='color', clarity='clarity', depth=None, table=None, price=None, x=None, y=None, z=None)
df[1] -- > Row(carat=0.23, cut='Ideal', color='E', clarity='SI2', depth=61.5, table=55, price=326, x=3.95, y=3.98, z=2.43)
Run Code Online (Sandbox Code Playgroud)

第 0 个元素看起来不像标题。

有人对此有解释吗?

谢谢!麦芽酒

sav*_*ata 5

当使用陈旧的统计数据来加速计算时,Hive 可能会给出错误的计数。要查看这是否是问题,请在 Hive 中尝试:

SET hive.compute.query.using.stats=false;
SELECT COUNT(*) FROM diamonds;
Run Code Online (Sandbox Code Playgroud)

或者,刷新统计信息。如果您的表未分区:

ANALYZE TABLE diamonds COMPUTE STATISTICS;
SELECT COUNT(*) FROM diamonds;
Run Code Online (Sandbox Code Playgroud)

如果是分区:

ANALYZE TABLE diamonds PARTITION(partition_column) COMPUTE STATISTICS;
Run Code Online (Sandbox Code Playgroud)

再看看你的第一行(df[0]在你的问题中)。它确实看起来像一个格式不正确的标题行。