Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 配置单元未使用分区选择外部表中的数据_Apache Spark_Hive_Azure Hdinsight - Fatal编程技术网

Apache spark 配置单元未使用分区选择外部表中的数据

Apache spark 配置单元未使用分区选择外部表中的数据,apache-spark,hive,azure-hdinsight,Apache Spark,Hive,Azure Hdinsight,我从未见过这种奇怪的行为 A在Spark生成的HDF中有拼花文件,分为3个分区 这是所有分区的计数。它由火花计算 +----------+--------+ |created_at|count(1)| +----------+--------+ | 20190101|12774895| | 20181231|18648432| | 20190102|30010065| +----------+--------+ 总数:61433392记录 蜂巢 创建了一个表。 CREATE EXTERN

我从未见过这种奇怪的行为

A在Spark生成的HDF中有拼花文件,分为3个分区

这是所有分区的计数。它由火花计算

+----------+--------+
|created_at|count(1)|
+----------+--------+
|  20190101|12774895|
|  20181231|18648432|
|  20190102|30010065|
+----------+--------+
总数:61433392记录

蜂巢

创建了一个表。

CREATE EXTERNAL TABLE raw.event (
    account_type STRING,
    event_name STRING,
    payload MAP<STRING, STRING>
)
PARTITIONED BY(created_at INT, product_name STRING, event_type STRING)
STORED AS PARQUET LOCATION '/datalake/raw/event'
TBLPROPERTIES('PARQUET.COMPRESS'='SNAPPY');
执行完整计数以确保一切顺利进行:

0:jdbc:hive2://headnodehost:10001/>从raw.event中选择count(*)

+---------------------------------------------------------------------+--+
|                              partition                              |
+---------------------------------------------------------------------+--+
| created_at=20181231/product_name=A/event_type=X  |
| created_at=20190101/product_name=A/event_type=X  |
| created_at=20190102/product_name=A/event_type=X  |
+---------------------------------------------------------------------+--+
+-----------+--+
|    _c0    |
+-----------+--+
| 61433392  |
+-----------+--+
+-------------+-----------+--+
| created_at  |    _c1    |
+-------------+-----------+--+
| 20190102    | 61433392  |
+-------------+-----------+--+
INFO  : Partition raw.event{created_at=20190102, product_name=A, event_type=X} stats: [numFiles=111, numRows=**61433392**, totalSize=19637211108, rawDataSize=1965868544]
预期结果!好的:)

现在只从一个分区计算

0:jdbc:hive2://headnodehost:10001/>从raw.event中选择count(*),其中创建了@u at=20190102和product_name='A'以及event_type='X'

+---------------------------------------------------------------------+--+
|                              partition                              |
+---------------------------------------------------------------------+--+
| created_at=20181231/product_name=A/event_type=X  |
| created_at=20190101/product_name=A/event_type=X  |
| created_at=20190102/product_name=A/event_type=X  |
+---------------------------------------------------------------------+--+
+-----------+--+
|    _c0    |
+-----------+--+
| 61433392  |
+-----------+--+
+-------------+-----------+--+
| created_at  |    _c1    |
+-------------+-----------+--+
| 20190102    | 61433392  |
+-------------+-----------+--+
INFO  : Partition raw.event{created_at=20190102, product_name=A, event_type=X} stats: [numFiles=111, numRows=**61433392**, totalSize=19637211108, rawDataSize=1965868544]
取而代之的是获得预期的12774895计数行,我仍然得到完整的计数

+-----------+--+
|    _c0    |
+-----------+--+
| 61433392  |
+-----------+--+
现在,我尝试按分区上创建的_进行计数和分组

0:jdbc:hive2://headnodehost:10001/>选择created_at,count(*)FROM raw.event group by created_at

+---------------------------------------------------------------------+--+
|                              partition                              |
+---------------------------------------------------------------------+--+
| created_at=20181231/product_name=A/event_type=X  |
| created_at=20190101/product_name=A/event_type=X  |
| created_at=20190102/product_name=A/event_type=X  |
+---------------------------------------------------------------------+--+
+-----------+--+
|    _c0    |
+-----------+--+
| 61433392  |
+-----------+--+
+-------------+-----------+--+
| created_at  |    _c1    |
+-------------+-----------+--+
| 20190102    | 61433392  |
+-------------+-----------+--+
INFO  : Partition raw.event{created_at=20190102, product_name=A, event_type=X} stats: [numFiles=111, numRows=**61433392**, totalSize=19637211108, rawDataSize=1965868544]
我仍然得到完整的行数,以及最后添加的分区

我很确定拼花地板文件包含不同的创建值

避免使用统计数据,也没有帮助

set hive.compute.query.using.stats=false;
分析表也没有帮助:

0:jdbc:hive2://headnodehost:10001/>分析表raw.event分区(创建时间、产品名称、事件类型)计算统计信息

INFO  : Partition raw.event{created_at=20181231, product_name=A, event_type=X} stats: [numFiles=111, numRows=**61433392**, totalSize=19637211108, rawDataSize=1965868544]
INFO  : Partition raw.event{created_at=20190101, product_name=A, event_type=X} stats: [numFiles=111, numRows=0, totalSize=19637211108, rawDataSize=0]
INFO  : Partition raw.event{created_at=20190102, product_name=A, event_type=X} stats: [numFiles=111, numRows=0, totalSize=19637211108, rawDataSize=0]
强制分区会产生相同的结果

0:jdbc:hive2://headnodehost:10001/>分析表raw.event分区(创建时间=20190102,产品名称,事件类型)计算统计信息

+---------------------------------------------------------------------+--+
|                              partition                              |
+---------------------------------------------------------------------+--+
| created_at=20181231/product_name=A/event_type=X  |
| created_at=20190101/product_name=A/event_type=X  |
| created_at=20190102/product_name=A/event_type=X  |
+---------------------------------------------------------------------+--+
+-----------+--+
|    _c0    |
+-----------+--+
| 61433392  |
+-----------+--+
+-------------+-----------+--+
| created_at  |    _c1    |
+-------------+-----------+--+
| 20190102    | 61433392  |
+-------------+-----------+--+
INFO  : Partition raw.event{created_at=20190102, product_name=A, event_type=X} stats: [numFiles=111, numRows=**61433392**, totalSize=19637211108, rawDataSize=1965868544]

有什么建议吗?

这可能与您添加分区的方式有关。看起来所有数据都在HDFS中的同一目录下。分区指向hdfs中的一个特定位置(不是多个位置),因此我假设1个分区指向整个数据集。您可以运行以下命令来验证分区位置

describe formatted raw.event  partition ( created_at=20181231,product_name="A",event_type="X");

此外,分区不依赖于数据本身,甚至目录、位置和值也不依赖于您将它们添加到表中的方式。这可能是统计数据的问题:给定命令中的
raw.event
partition
之间应该有一个空格。最小编辑是6个字符,所以我不能自己编辑它。另外,我和OP在同一个团队中,运行该命令验证了分区位置在
/raw/event/created\u at=20190101/product\u name=A/event\u type=X
@VishaalKalwani,那么分区的其余部分呢?位置是什么?是否有任何数据?对于所有3个分区(20191291、20190101、20190102),位置都遵循相同的模式。事实上,查询返回的结果与之前完全不同(使用
*.stats=true
*.stats=false
,但结果是相同和不同的)。配置设置是否有传播期?查询
选择created_at,count(*)FROM raw.event group by created_at
现在返回:
{20181231=>1262881758120190101=>117721617920190102=>2148549023}
。我修改了输出的格式,使其在这条评论中清晰可见。而且,它现在看起来与Databricks的结果相匹配,尽管与OP posted的数字不同。我将与OP讨论这些结果。很奇怪,它最初没有起作用。