我是云数据流和Java的新手,所以我希望这是一个正确的问题。
我有一个csv文件,其中包含n个列和行,可以是字符串,整数或时间戳。我是否需要为每列创建新的PCollection?
我在示例中找到的大多数文档都类似于:
PCollection<String> data = p.apply(TextIO.Read.from("gs://abc/def.csv"));
但对我来说,将整个csv文件导入为字符串是没有意义的。我在这里错过了什么以及如何设置我的PCollections?
答案 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"
。您可以通过ParDo
或MapElements
转换来管理集合,从而在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>() {});)