0

GCS에서 줄 바꿈으로 구분 된 JSON 파일을 gzip으로 압축했습니다. Dataflow를 사용하여로드하고 BigQuery에 저장하려고합니다.Google Cloud Dataflow (Apache Beam) - 항상 gzip 파일의 첫 번째 줄을 구문 분석하지 못합니다.

그러나 항상 파일의 첫 번째 줄에서 JSON을 구문 분석하지 못합니다. 나는 파일 내용을 확인하면 내가 잭슨을 사용하고 로그 그러나

Failed to parse JSON, com.fasterxml.jackson.core.JsonParseException: 
    Unexpected character ('_' (code 95)): 
    Expected space separating root-level values at 
    [Source: (String)"40085_telemetry_2015-09-09.log0000664000076600007660000011300712574251007016553 
    0ustar xxxadminxxxadmin"[truncated 142 chars]; 
    line: 1, column: 7 

을 말한다, 위의 같은 어떤 문자열이 없었다. 확실히 유효한 JSON 문자열입니다. Dataflow가 처리를 시작할 때 위의 문자열이 첫 번째 줄의 시작 부분 앞에 추가됩니다.

이유가 궁금하십니까? Apache Beam Java SDK 버전 2.1.0을 사용합니다. 아래

내 코드 showns는 :

static class ReadFile extends PTransform<PInput, PCollection<String>> { 
    private static final long serialVersionUID = 1L; 
    private ValueProvider<String> files; 

    public ReadFile(ValueProvider<String> env, ValueProvider<String> productName, ValueProvider<String> files, 
      ValueProvider<String> deadLetterId) { 
     this.files = files; 
    } 

    @Override 
    public PCollection<String> expand(PInput input) { 
     Pipeline p = input.getPipeline(); 

     // this pipeline supports both wildcard and comma separated 
     String inputFile = files.get(); 
     if (inputFile.contains("*")) { 
      return p.apply("Read from GCS with wildcard prefix", 
        TextIO.read().from(inputFile).withCompressionType(CompressionType.GZIP)); 
     } 

     String[] targetFiles = inputFile.split(","); 
     PCollectionList<String> rowsList = PCollectionList.empty(p); 
     for (String targetFile : targetFiles) { 
      PCollection<String> fileLines = p.apply("Read (" + targetFile + ")", 
        TextIO.read().from(targetFile).withCompressionType(CompressionType.GZIP)); 
      rowsList = rowsList.and(fileLines); 
     } 

     PCollection<String> allRows = rowsList.apply("Flatten rows", Flatten.<String>pCollections()); 
     return allRows; 
    } 
} 
+0

Java 또는 Python SDK를 사용하고 있습니까? 파이프 라인의이 부분을 구성하는 코드를 보여줄 수 있습니까? 이 파일을 "gzip -d"를 사용하여 압축 해제 할 수 있습니까? 파일 확장자 란 무엇입니까? – jkff

+0

답장을 보내 주셔서 감사합니다. @jkff. 나는 정보를 추가했지만, 그 동안에는 "gzip -d"로 파일을 압축 해제 할 때 문자열이 첫 번째 줄에 붙습니다. (Mac의 Archive Utility를 사용하면 발생하지 않았습니다.) –

+0

@jkff "gzip -d"로 보이는 것은 정확하고이 문자열은 실제로 존재하지만 Mac Archive Utility는 어떻게 든 그것을 친절하게 생략합니다. 죄송합니다. 데이터가 문제가 될 수 있습니다. ( –

답변

1

난 그냥 우리 파일의 문제가 있음을 발견했다. 내 로컬에 gzip -d을 사용하면 이상한 문자열이 실제로 내 파일의 시작 부분에 존재합니다.

어떻게 든 Mac의 아카이브 유틸리티는 그 부분을 생략하고 나는 그것을 알아 차리지 못했습니다. 지금까지는이 문제를 극복하기 위해 첫 번째 "{"를 찾을 때까지 내 파이프 라인에서 문자열을 제거하도록 하드 코드 할 수 있습니다.