>source

JSON을 CSV로 변환하지 않고 새 Google BigQuery 테이블에 직접로드하려고합니다.

내가받는 JSON은 다음 형식입니다.

{'columns': ['Month ', 'Product ', 'Customer', 'sales_qty', 'net_sales'],
 'data': [['201701', '001117', 'C00899', 72.0, 27400.0], ['201701', '001117', 'C00954', 72.0, 32640.0]]}

스키마가 다를 수 있으므로 프로그래밍 방식으로 테이블을 생성 할 수 있어야하므로 JobConfig의 자동 감지 옵션을 사용하고 있습니다 (CSV에서 잘 작동 함).

다음 코드 스 니펫을 작성했습니다.

json_object = json.loads(my_json)
gbqclient = bigquery.Client.from_service_account_json(GBQ_JSON_KEY)
dataset_ref = gbqclient.dataset(GBQ_DATASET)
table_ref = dataset_ref.table(GBQ_TABLE)
# job config for layout JSON
job_config = bigquery.LoadJobConfig()
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON
#job_config.skip_leading_rows = 0
job_config.autodetect = True
# push data
job = gbqclient.load_table_from_json(json_object , table_ref, job_config = job_config)
pass

이것은 GBQ에 제대로 연결되지만 업로드 작업은 다음과 같은 오류와 함께 실패합니다.

Error while reading data, error message: Failed to parse JSON: No active field found.; ParsedString returned false

사용중인 JSON 형식이 NEWLINE_DELIMITED_JSON이 아니라는 것을 알고 있습니다. BigQuery API에서 읽을 수있는 형식으로 JSON을 변환하는 방법에 대한 도움말을 찾고 있습니다.

감사!

  • 답변 # 1

    JSON 개체가 올바르지 않습니다. 행 배열이 필요합니다. 행은 key : value 요소입니다.

    이렇게

    data = [
      {
        'Month':'201701',
        'Product':'001117',
        'Customer':'C00899',
        'sales_qty':72.0, 
        'net_sales':27400.0
      },
      {
        'Month':'201701',
        'Product':'001117',
        'Customer':'C00954',
        'sales_qty':72.0, 
        'net_sales':32640.0
      },
    ]
    
    

    현재 JSON을 다음과 같이 변환하십시오.

    <시간 />

    여기에 항목을 예상 데이터로 변환하는 샘플 코드가 있습니다.

       entry = {'columns': ['Month ', 'Product ', 'Customer', 'sales_qty', 'net_sales'],
               'data': [['201701', '001117', 'C00899', 72.0, 27400.0], ['201701', '001117', 'C00954', 72.0, 32640.0]]}
        c = entry['columns']
        data=[]
        for d in entry['data']:
            row={}
            for i in range(len(c)):
                row[c[i]] = d[i]
            data.append(row)
        print(data)
    
    
    

    참고 : 내 파이썬 기술은 낮지 만 작동합니다.

관련 자료

  • 이전 multithreading - C ++에서 RAII를 사용하여 스레드 래퍼 클래스의시 매틱 이동
  • 다음 mysql - 외래 키를 추가하지 못했습니다