在AI Notebook中使用AVRO写入GCS

时间:2019-11-20 21:29:36

标签: python-3.x google-cloud-platform google-cloud-storage avro google-cloud-datalab

摘要:

1)如何在Jupyter笔记本(如AI笔记本)中将熊猫数据帧写入GCS(Google云存储)

2)在同一笔记本中,如何调用该对象以将其上传到Bigquery中的新数据集中

问题

我确实有一个足够大的对象,无法在本地下载它,然后将其写入GCS-> BQ。但是,该对象的大小不足以使用Apache-Beam进行处理。我用BQ魔术带进了笔记本。进行一些转换后,我想将一个对象发送回我的数据存储库。因此,我试图使用AVRO进行复制,但是我不知道如何使它工作。我已尝试遵循本指南(https://github.com/ynqa/pandavro),但尚未弄清楚应如何编写该功能。

我正在这样做:

OUTPUT_PATH='{}/resumen2008a2019.avro'.format('gcs://xxxx')
pdx.to_avro(OUTPUT_PATH,df4)

这将返回以下错误:FileNotFoundError:[Errno 2]没有这样的文件或目录:'gcs:// xxxx'

为什么不镶木地板? 无法将数据正确地转换为JSON:ArrowInvalid :(“无法转换为类型str:试图转换为双精度型”,“对于类型对象的列salario转换失败”)

为什么不直接? 我尝试将这篇文章用作指导(Write a Pandas DataFrame to Google Cloud Storage or BigQuery)。但是它已经三岁了,许多东西不再像那样工作了。

我应该投降,只写一部经典的ol´ csv吗?

1 个答案:

答案 0 :(得分:3)

非常支持直接将DataFrame写入BigQuery,并且工作顺利。

假设您使用的是Google Cloud AI Platform笔记本(因此我们不需要设置服务帐户和安装bq软件包),则可以执行以下操作以将Dataframe写入BQ表:

    client = bigquery.Client(location="US")
    dataset_id = 'your_new_dataset'
    dataset = client.create_dataset(dataset_id) 

    records = [
        {"title": "The Meaning of Life", "release_year": 1983},
        {"title": "Monty Python and the Holy Grail", "release_year": 1975},
        {"title": "Life of Brian", "release_year": 1979},
        {"title": "And Now for Something Completely Different", "release_year": 1971},
    ]

    # Optionally set explicit indices.
    # If indices are not specified, a column will be created for the default
    # indices created by pandas.
    index = ["Q24980", "Q25043", "Q24953", "Q16403"]
    df = pandas.DataFrame(records, index=pandas.Index(index, name="wikidata_id"))

    table_ref = dataset.table("monty_python")
    job = client.load_table_from_dataframe(df, table_ref, location="US")

    job.result()  # Waits for table load to complete.
    print("Loaded dataframe to {}".format(table_ref.path))

如果确实要使用Pandavro,则将需要修改输出路径“ gs://”,因为它不是本地路径,并且只能写入文件系统的工具无法理解。您基本上必须将其分为以下步骤:

  1. 将文件写入本地目录
  2. 运行加载作业,将生成的avro文件放入BigQuery