2017-12-17 15 views
0

이 포함되어있을 때 BigQuery에서 데이터를 읽을 수 없습니다. 최신 Apache Beam SDK for Python 2.2.0을 사용하여 정의 된 파이프 라인에서 BigQuery 테이블을 읽고 쓰는 간단한 파이프 라인을 실행할 때이 오류가 발생합니다.타임 스탬프 열에 연도 <1900

연도가 < 인 타임 스탬프가 몇 행에 있으므로 읽기 작업이 실패합니다. 이 dataflow_worker 패키지를 어떻게 패치 할 수 있습니까?

apache_beam.runners.dataflow.dataflow_runner.DataflowRuntimeException: Dataflow pipeline failed. State: FAILED, Error: 
(4d31192aa4aec063): Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/dataflow_worker/batchworker.py", line 582, in do_work 
    work_executor.execute() 
    File "/usr/local/lib/python2.7/dist-packages/dataflow_worker/executor.py", line 167, in execute 
    op.start() 
    File "dataflow_worker/native_operations.py", line 38, in dataflow_worker.native_operations.NativeReadOperation.start 
    def start(self): 
    File "dataflow_worker/native_operations.py", line 39, in dataflow_worker.native_operations.NativeReadOperation.start 
    with self.scoped_start_state: 
    File "dataflow_worker/native_operations.py", line 44, in dataflow_worker.native_operations.NativeReadOperation.start 
    with self.spec.source.reader() as reader: 
    File "dataflow_worker/native_operations.py", line 48, in dataflow_worker.native_operations.NativeReadOperation.start 
    for value in reader: 
    File "/usr/local/lib/python2.7/dist-packages/dataflow_worker/nativefileio.py", line 198, in __iter__ 
    for record in self.read_next_block(): 
    File "/usr/local/lib/python2.7/dist-packages/dataflow_worker/nativeavroio.py", line 95, in read_next_block 
    yield self.decode_record(record) 
    File "/usr/local/lib/python2.7/dist-packages/dataflow_worker/nativebigqueryavroio.py", line 110, in decode_record 
    record, self.source.table_schema) 
    File "/usr/local/lib/python2.7/dist-packages/dataflow_worker/nativebigqueryavroio.py", line 104, in _fix_field_values 
    record[field.name], field) 
    File "/usr/local/lib/python2.7/dist-packages/dataflow_worker/nativebigqueryavroio.py", line 83, in _fix_field_value 
    return dt.strftime('%Y-%m-%d %H:%M:%S.%f UTC') 
ValueError: year=200 is before 1900; the datetime strftime() methods require year >= 1900 

답변

0

불행히도, 이것이 Google의 Apache Beam 러너 인 Dataflow의 내부 구현이기 때문에 타임 스탬프와 함께 작동하도록 패치 할 수 없습니다. 따라서 Google에서 버그가 확인 될 때까지 기다려야합니다. 이 문제는 버그가 아니라 파이썬 버전의 한계가되기 때문에 가능한 빨리보고하십시오.

문제는 strftime에서 알 수 있습니다. documentation에 명시 적으로 언급하면 ​​1900 년 이전의 어떤 연도에도 작동하지 않습니다. 해결 방법은 타임 스탬프를 문자열로 변환하는 것입니다 (documentation에 지정된대로 BigQuery에서이를 수행 할 수 있음). 그리고 빔 파이프 라인에서 다시 타임 스탬프 나 다른 어떤 것보다 가장 좋은 것을 다시 변환 할 수 있습니다.

datetime 개체를 answer에 오류의 서식 파일로 문자열로 변환하는 방법에 대한 예제도 있습니다. 같은 질문에 또 다른 answer이 있는데,이 버그로 어떤 일이 벌어 졌는지, 어떻게 해결되었는지 (파이썬에서) 그리고 당신이 할 수있는 일을 설명합니다. 불행히도이 솔루션은 strftime을 전혀 사용하지 않는 것으로 보이며 대신 몇 가지 대안을 사용합니다.