使用Google Cloud Dataflow创建大型CSV数据

时间:2017-03-29 04:19:10

标签: csv google-cloud-dataflow

我需要使用标题创建 ~20亿条记录的大型csv文件。使用独立脚本创建需要很长时间,但由于记录不相关,我了解云数据流可以使其分布式旋转我选择的多个工作者GCE机器。云数据流是否总是需要输入。在这里,我尝试以编程方式生成以下格式的数据

ItemId,   ItemQuantity, ItemPrice, Salevalue, SaleDate
item0001, 25          , 100      , 2500      , 2017-03-18
item0002, 50          , 200      , 10000     , 2017-03-25 

请注意

ItemId可以后缀为0001到9999之间的任意随机数ItemQuantity可以是(1到1000)之间的随机值ItemPrice可以是(1到100)之间的随机值SaleValue = ItemQuantity * ItemPrice日期在2015-01-01之间2017年12月31日

任何语言都可以。

继续问题Generating large file using Google Cloud Dataflow

1 个答案:

答案 0 :(得分:1)

目前,没有一种非常优雅的方式。在Python中你会这样做(对于Java来说,只是语法更改):

def generate_keys():
  for i in range(2000):
    # Generate 2000 key-value pairs to shuffle
    yield (i, 0)

def generate_random_elements():
  for i in range(1000000):
    yield random_element()

p = beam.Pipeline(my_options)
(p 
 | beam.Create(['any']) 
 | beam.FlatMap(generate_keys)
 | beam.GroupByKey()
 | beam.FlatMap(generate_random_elements)
 | beam.WriteToText('gs://bucket-name/file-prefix'))

generate_keys()中,我们生成了2000个不同的密钥,然后我们运行GroupByKey,以便将它们拖放到不同的工作人员。我们需要这样做,因为DoFn目前不能分成几个工作人员。 (一旦SplittableDoFn实施,这将更加容易。)

请注意,当Dataflow将结果写入接收器时,它通常会将它们分成不同的文件(例如gs://bucket-name/file-prefix-0000-00001,依此类推),因此您需要将这些文件压缩在一起。

此外,您可以使用--num_workers 10,或者在Dataflow中生成多个,或使用自动缩放。