【发布时间】:2019-04-10 10:48:26
【问题描述】:
我们有一个用例来准备一个 spark 作业,该作业将从多个提供程序读取数据,其中包含有关以任意顺序存在的用户的信息,并将它们写回 S3 中的文件。现在,条件是,用户的所有数据都必须存在于单个文件中。大约有 100 万独立用户,每个用户最多有大约 10KB 的数据。我们考虑最多创建 1000 个文件,并让每个文件包含大约 1000 个用户的记录。
我们使用 java 数据框 API 来针对 spark 2.4.0 创建作业。我无法理解这样做最合乎逻辑的方式是什么?我是否应该对用户 ID 进行分组操作,然后以某种方式收集行,除非我达到 1000 个用户,然后翻转(如果可能的话)或者有更好的方法。非常感谢任何帮助或正确方向的提示。
更新:
按照答案中的建议后,我继续使用以下代码 sn-p,但我仍然看到正在写入 200 个文件,而不是 1000 个。
Properties props = PropLoader.getProps("PrepareData.properties");
SparkSession spark = SparkSession.builder().appName("prepareData").master("local[*]")
.config("fs.s3n.awsAccessKeyId", props.getProperty(Constants.S3_KEY_ID_KEY))
.config("fs.s3n.awsSecretAccessKey", props.getProperty(Constants.S3_SECERET_ACCESS_KEY)).getOrCreate();
Dataset<Row> dataSet = spark.read().option("header", true).csv(pathToRead);
dataSet.repartition(dataSet.col("idvalue")).coalesce(1000).write().parquet(pathToWrite);
spark.close();
但是,如果我使用 100,而不是 1000,那么我会看到 100 个文件。然后我点击@Alexandros 分享的链接,下面的代码 sn-p 在它们各自的目录中生成了超过 20000 个文件,而且执行时间也像疯了一样。
dataSet.repartition(1000, dataSet.col("idvalue")).write().partitionBy("idvalue").parquet(pathToWrite);
【问题讨论】:
-
你好@Bitswazsky 你有这里提到的选项:stackoverflow.com/questions/50775870/…
标签: java apache-spark