我需要使用标题创建 ~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日
任何语言都可以。
答案 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中生成多个,或使用自动缩放。