Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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
Hadoop 配置单元-将大型有序查询结果集拆分为多个连续文件_Hadoop_Amazon S3_Hive_Amazon Redshift - Fatal编程技术网

Hadoop 配置单元-将大型有序查询结果集拆分为多个连续文件

Hadoop 配置单元-将大型有序查询结果集拆分为多个连续文件,hadoop,amazon-s3,hive,amazon-redshift,Hadoop,Amazon S3,Hive,Amazon Redshift,我正在使用HIVE对S3上的原始数据进行ETL处理。我生成结构化输出数据,在加载到另一个数据库(红移)之前对其进行排序。 数据需要以可管理块的排序顺序加载到红移中,例如,每个块50-100亿行,其中总数据集是1000亿条记录 我正在寻找一种方法,让hive对数据进行排序,然后将其分成更小的可管理的块,这些块可以按排序顺序单独上传。 到目前为止,我还没有能够想出一个方法,让我做到这一点。由于我使用了一个“orderby”子句,所以我得到了一个庞大的文件,所以配置单元中的减缩器数量强制为1我无法将这

我正在使用HIVE对S3上的原始数据进行ETL处理。我生成结构化输出数据,在加载到另一个数据库(红移)之前对其进行排序。 数据需要以可管理块的排序顺序加载到红移中,例如,每个块50-100亿行,其中总数据集是1000亿条记录

我正在寻找一种方法,让hive对数据进行排序,然后将其分成更小的可管理的块,这些块可以按排序顺序单独上传。 到目前为止,我还没有能够想出一个方法,让我做到这一点。由于我使用了一个“orderby”子句,所以我得到了一个庞大的文件,所以配置单元中的减缩器数量强制为1我无法将这么大的文件从S3中移出以进行解压缩/拆分/重新压缩/重新加载,因为我没有地方来完成所有这些。

使用“clusterby”生成内部排序的块,但不能保证块之间的顺序

sort by键是一个复合字母数字键,且不同计数太大,无法按其进行分区

群集/分发问题:


根据我的理解,集群和分发选项的问题是,分发是基于分发密钥的散列进行的。如果x一种可能的解决方案可能是对完整排序的输出使用bash split命令,将其拆分为较小的文件

以下内容摘自手册页:

NAME
       split - split a file into pieces

SYNOPSIS
       split [OPTION]... [INPUT [PREFIX]]

DESCRIPTION
       Output  fixed-size  pieces  of  INPUT  to PREFIXaa, PREFIXab, ...; default size is 1000 lines, and default PREFIX is 'x'.  With no INPUT, or when INPUT is -, read
       standard input.

       Mandatory arguments to long options are mandatory for short options too.

       -a, --suffix-length=N
              use suffixes of length N (default 2)

       -b, --bytes=SIZE
              put SIZE bytes per output file

       -C, --line-bytes=SIZE
              put at most SIZE bytes of lines per output file

       -d, --numeric-suffixes
              use numeric suffixes instead of alphabetic

       -l, --lines=NUMBER
              put NUMBER lines per output file

       --verbose
              print a diagnostic just before each output file is opened

       --help display this help and exit

       --version
              output version information and exit

       SIZE may be (or may be an integer optionally followed by) one of following: KB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for G, T, P, E, Z, Y.
比如说:

拆分-l 5000000000文件名


可能有用。

从蜂巢加载S3: 您可以使用
LOCATION's3:///etc
为配置单元指定一个外部文件(当您使用Order By配置单元生成一个大文件时),这样配置单元将直接将其放入s3中

手动加载:使用Sort By时,应对一个减速机中的数据进行排序。您是否尝试使用单独的密钥,以便在对数据进行排序时,通过某个密钥分发数据


选择分发密钥时,应确保应该在一个存储桶中的所有记录不会转到任何其他文件

您可以尝试将表扣起来,这样会创建一些大小接近相等的分区,从而更易于操作

 Create table mytable (
 record_ID string,
 var1 double
 )
 clustered by record_ID into 100 buckets;


set hive.enforce.bucketing = true;
from my_other_table
insert overwrite table mytable
select *;

此外,您还可以创建一个随机数并用它进行分区。在hive中使用random()udf同样容易。

我在帖子中已经提到,我没有空间从S3中取出这个文件来执行此操作并将其放回原处。这一个文件可能很容易被删除,因为我已经在S3中生成了一个非常大的文件。但我不能一次加载它,这就是为什么我需要一种方法来打破它。现在,分发密钥的问题是,数据是基于密钥的散列进行分发的。假设我的数据是按名称排序的。将名称散列到不同的文件将打破文件之间的排序顺序。每个文件都将按名称排序,但是跨文件的数据不再排序。是的,分发密钥应该在逻辑上划分数据。例如,假设你有一所学校的学生分数——如果你按班级划分并对我的分数进行排序,那么你仍然可以使用这些数据。在这里,基于标记的全局排序对您没有帮助。如果可以的话,共享源数据模型,这样可能会有一些建议。通过将记录ID聚集到100个bucket中,将记录1和101放在同一个文件中。记录2和102进入同一个文件。这打破了我正在寻找的排序顺序。您需要创建一个保持顺序的变量,然后在其上划分一个表。