ETL&解析Cloud Dataflow中的CSV文件

时间:2016-05-25 14:33:33

标签: csv google-cloud-dataflow

我是云数据流和Java的新手,所以我希望这是一个正确的问题。

我有一个csv文件,其中包含n个列和行,可以是字符串,整数或时间戳。我是否需要为每列创建新的PCollection?

我在示例中找到的大多数文档都类似于:

PCollection<String> data = p.apply(TextIO.Read.from("gs://abc/def.csv"));

但对我来说,将整个csv文件导入为字符串是没有意义的。我在这里错过了什么以及如何设置我的PCollections?

2 个答案:

答案 0 :(得分:4)

line.split(",");

String.split如果这样的行数据没有意义:

  

a,b,c,&#34;我们有一个包含逗号的字符串&#34;,d,e

处理csv数据的属性方法是导入csv库:

        <dependency>
            <groupId>com.opencsv</groupId>
            <artifactId>opencsv</artifactId>
            <version>3.7</version>
        </dependency>

并在ParDo中使用以下代码:

public void processElement(ProcessContext c) throws IOException {
    String line = c.element();
    CSVParser csvParser = new CSVParser();
    String[] parts = csvParser.parseLine(line);
}

答案 1 :(得分:3)

此示例将创建一个集合,该集合在文件中每行包含1 String,例如如果文件是:

Alex,28,111-222-3344
Sam,30,555-666-7788
Drew,19,123-45-6789

然后该集合将在逻辑上包含"Alex,28,111-222-3344""Sam,30,555-666-7788""Drew,19,123-45-6789"。您可以通过ParDoMapElements转换来管理集合,从而在Java中应用进一步的解析代码,例如:

class User {
    public String name;
    public int age;
    public String phone;
}

PCollection<String> lines = p.apply(TextIO.Read.from("gs://abc/def.csv"));
PCollection<User> users = lines.apply(MapElements.via((String line) -> {
    User user = new User();
    String[] parts = line.split(",");
    user.name = parts[0];
    user.age = Integer.parseInt(parts[1]);
    user.phone = parts[2];
    return user;
}).withOutputType(new TypeDescriptor<User>() {});)