如何EMR S3DistCp组正确?

Bar*_*Alp 4 amazon-emr distcp s3distcp

我正在使用aws .net sdk向EMR运行s3distcp作业,以使用--groupBy arg连接文件夹中的所有文件.但无论我尝试过什么"groupBy"arg,它都会一直失败,或者只是复制文件而不连接,就像在arg列表中指定没有--groupBy一样.

文件夹中的文件是spark saveAsTextFiles,如下所示:

部分0000
兼职0001
兼职技术
...
...

step.HadoopJarStep = new HadoopJarStepConfig
            {
                Jar = "/usr/share/aws/emr/s3-dist-cp/lib/s3-dist-cp.jar",
                Args = new List<string>
                {
                    "--s3Endpoint=s3-eu-west-1.amazonaws.com",
                    "--src=s3://foo/spark/result/bar" ,
                    "--dest=s3://foo/spark/result-merged/bar",
                    "--groupBy=(part.*)",
                    "--targetSize=256"

                }
            };
Run Code Online (Sandbox Code Playgroud)

Bar*_*Alp 7

经过这一整天的挣扎,最后我得到了它与groupKey arg下面的工作:

--groupBy=.*part.*(\w+)
Run Code Online (Sandbox Code Playgroud)

但即使我添加--targetSize=1024到args s3distcp产生2,5MB - 3MB文件.有没有人对它有任何想法?

***更新***

这是groupBy子句,它将所有文件连接到一个文件中,位于自己的文件夹中:

.*/(\\w+)/.*
Run Code Online (Sandbox Code Playgroud)

最后一个"/"在这里非常重要--source ="s3:// foo/spark/result /"

"result"文件夹中有一些文件夹:

s3://foo/spark/result/foo
s3://foo/spark/result/bar
s3://foo/spark/result/lorem
s3://foo/spark/result/ipsum
Run Code Online (Sandbox Code Playgroud)

并在上面的每个文件夹中有数百个文件,如:

part-0000
part-0001
part-0002
Run Code Online (Sandbox Code Playgroud)

.*/(\\w+)/.* 这个group by子句对每个文件夹中的每个文件进行分组,所以最后你为每个文件夹命名了一个文件

s3://foo/spark/result-merged/foo/foo -> File
s3://foo/spark/result-merged/bar/bar -> File
s3://foo/spark/result-merged/lorem/lorem -> File
s3://foo/spark/result-merged/ipsum/ipsum -> File
Run Code Online (Sandbox Code Playgroud)

所以,这是我的最后工作命令:

s3-dist-cp --src s3://foo/spark/result/  --dest s3://foo/spark/results-merged --groupBy '.*/(\\w+)/.*' --targetSize 1024
Run Code Online (Sandbox Code Playgroud)

谢谢.