Как получить читаемый файл? - PullRequest
0 голосов
/ 21 апреля 2019

У меня есть каталог, заполненный 99 файлами, я хочу прочитать эти файлы и затем хэшировать их в контрольную сумму sha256. В конце концов я хочу вывести их в файл JSON с парой ключ-значение, например (Файл 1, 092180x0123). В настоящее время у меня возникают проблемы с передачей моей функции ParDo для чтения файла, я должен упустить что-то очень простое. Я впервые использую Apache Beam, поэтому любая помощь будет потрясающей. Вот что у меня пока

public class BeamPipeline {

    public static void main(String[] args)  {

        PipelineOptions options = PipelineOptionsFactory.create();
        Pipeline p = Pipeline.create(options);

            p
            .apply("Match Files", FileIO.match().filepattern("../testdata/input-*"))
            .apply("Read Files", FileIO.readMatches())
            .apply("Hash File",ParDo.of(new DoFn<FileIO.ReadableFile, KV<FileIO.ReadableFile, String>>() {
        @ProcessElement
        public void processElement(@Element FileIO.ReadableFile file, OutputReceiver<KV<FileIO.ReadableFile, String>> out) throws
        NoSuchAlgorithmException, IOException {
            // File -> Bytes
            String strfile = file.toString();
            byte[] byteFile = strfile.getBytes();


            // SHA-256
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] messageDigest = md.digest(byteFile);
            BigInteger no = new BigInteger(1, messageDigest);
            String hashtext = no.toString(16);
            while(hashtext.length() < 32) {
                hashtext = "0" + hashtext;
            }
            out.output(KV.of(file, hashtext));
        }
    }))
            .apply(FileIO.write());
        p.run();
    }
}

1 Ответ

1 голос
/ 21 апреля 2019

Один пример для пары KV, содержащей соответствующее имя файла (от MetadataResult) и соответствующий SHA-256 всего файла (вместо чтения его построчно):

p
  .apply("Match Filenames", FileIO.match().filepattern(options.getInput()))
  .apply("Read Matches", FileIO.readMatches())
  .apply(MapElements.via(new SimpleFunction <ReadableFile, KV<String,String>>() {
      public KV<String,String> apply(ReadableFile f) {
            String temp = null;
            try{
                temp = f.readFullyAsUTF8String();
            }catch(IOException e){

            }

            String sha256hex = org.apache.commons.codec.digest.DigestUtils.sha256Hex(temp);   

            return KV.of(f.getMetadata().resourceId().toString(), sha256hex);
        }
      }
  ))
  .apply("Print results", ParDo.of(new DoFn<KV<String, String>, Void>() {
      @ProcessElement
      public void processElement(ProcessContext c) {
        Log.info(String.format("File: %s, SHA-256: %s ", c.element().getKey(), c.element().getValue()));
      }
    }
 ));

Fullкод здесь .Вывод в моем случае был:

Apr 21, 2019 10:02:21 PM com.dataflow.samples.DataflowSHA256$2 processElement
INFO: File: /home/.../data/file1, SHA-256: e27cf439835d04081d6cd21f90ce7b784c9ed0336d1aa90c70c8bb476cd41157 
Apr 21, 2019 10:02:21 PM com.dataflow.samples.DataflowSHA256$2 processElement
INFO: File: /home/.../data/file2, SHA-256: 72113bf9fc03be3d0117e6acee24e3d840fa96295474594ec8ecb7bbcb5ed024

, который я проверял с помощью онлайн-хеширования tool :

enter image description here

Кстати, я не думаю, что вам нужно OutputReceiver для одного выхода (без боковых выходов).Благодаря этим вопросам / ответам, которые были полезны: 1 , 2 , 3 .

...