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