Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.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
Java 如何在烫伤中保持平衡_Java_Scala_Hadoop_Bucket_Scalding - Fatal编程技术网

Java 如何在烫伤中保持平衡

Java 如何在烫伤中保持平衡,java,scala,hadoop,bucket,scalding,Java,Scala,Hadoop,Bucket,Scalding,我正在尝试将管道输出到不同的目录中,这样每个目录的输出将根据一些ID进行调整。 因此,在一个普通的MapReduce代码中,我将使用MultipleOutputs类,并在reducer中执行类似的操作 protected void reduce(final SomeKey key, final Iterable<SomeValue> values, final Context context) { ... for (SomeValue value

我正在尝试将管道输出到不同的目录中,这样每个目录的输出将根据一些ID进行调整。 因此,在一个普通的MapReduce代码中,我将使用MultipleOutputs类,并在reducer中执行类似的操作

protected void reduce(final SomeKey key,
      final Iterable<SomeValue> values,
      final Context context) {

   ...
   for (SomeValue value: values) {
     String bucketId = computeBucketIdFrom(...);
     multipleOutputs.write(key, value, folderName + "/" + bucketId);
   ...
protectedvoid reduce(最终SomeKey键,
最终可测值,
最终上下文(上下文){
...
for(SomeValue值:值){
字符串bucketId=computeBucketIdFrom(…);
multipleoutput.write(键、值、文件夹名+“/”+bucketId);
...
所以我想一个人可以在烫伤中这样做

...
  val somePipe = Csv(in, separator = "\t",
        fields = someSchema,
        skipHeader = true)
    .read

  for (i <- 1 until numberOfBuckets) {
    somePipe
    .filter('someId) {id: String => (id.hashCode % numberOfBuckets) == i}
    .write(Csv(out + "/bucket" + i ,
      writeHeader = true,
      separator = "\t"))
  }
。。。
val somePipe=Csv(in,separator=“\t”,
fields=someSchema,
skipHeader=true)
阅读

对于(i是的,当然有更好的使用方法

因此,您上面的代码可以按如下方式编写:

val somePipe = Tsv(in, fields = someSchema, skipHeader = true)
    .read
    .write(TemplatedTsv(out, "%s", 'some_id, writeHeader = true))
这将把来自“some_id”的所有记录放在out/some_id文件夹下的单独文件夹中

但是,您也可以创建整数桶。只需更改最后一行

.map('some_id -> 'bucket) { id: String => id.hashCode % numberOfBuckets }    
.write(TemplatedTsv(out, "%02d", 'bucket, writeHeader = true, fields = ('all except 'bucket)))
这将创建两位数的文件夹out/dd/。您还可以检查templatedTsv api


使用templatedTsv可能会有一个小问题,即还原程序会生成大量小文件,这对使用您的结果执行下一项工作可能不好。因此,最好在写入磁盘之前对模板字段进行排序。我为此写了一篇博客

您能帮我回答此处发布的一个相关问题吗?是的,我已经回答了那个问题。希望它是有帮助的,最好的