将CSV导入Google云数据存储区

时间:2018-01-27 05:50:05

标签: csv google-app-engine google-cloud-datastore google-cloud-dataflow

我有一个包含2列和20,000行的CSV文件,我想将其导入Google Cloud Datastore。我是Google Cloud和NoSQL数据库的新手。我尝试使用数据流但需要提供Javascript UDF函数名称。有没有人有这样的例子?我将在数据存储区中查询这些数据。 任何关于如何创建这个的建议或指导将不胜感激。

2 个答案:

答案 0 :(得分:4)

使用Apache Beam,您可以使用TextIO类读取CSV文件。请参阅TextIO文档。

Pipeline p = Pipeline.create();

p.apply(TextIO.read().from("gs://path/to/file.csv"));

接下来,应用一个转换,该转换将解析CSV文件中的每一行并返回Entity个对象。根据您希望存储每一行​​的方式,构造相应的Entity对象。 This page有一个如何创建Entity对象的示例。

.apply(ParDo.of(new DoFn<String, Entity>() {
    @ProcessElement
    public void processElement(ProcessContext c) {
        String row = c.element();
        // TODO: parse row (split) and construct Entity object
        Entity entity = ...
        c.output(entity);
    }
}));

最后,将Entity个对象写入Cloud Datastore。请参阅DatastoreIO文档。

.apply(DatastoreIO.v1().write().withProjectId(projectId));

答案 1 :(得分:1)

简单的python,但很容易适应其他语言。使用split()方法遍历行和逗号分隔值:

from google.appengine.api import urlfetch
from my.models import MyModel

csv_string   = 'http://someplace.com/myFile.csv'
csv_response = urlfetch.fetch(csv_string, allow_truncated=True) 

if csv_response.status_code == 200:
    for row in csv_response.content.split('\n'):
        row_values = row.split(',')
        # csv values are strings.  Cast them if they need to be something else
        new_entry = MyModel(
            property1 = row_values[0],
            property2 = row_values[1]
        )
        new_entry.put()

else:
    print 'cannot load file: {}'.format(csv_string)