我们有没有可能在Spark中先按一列分区,然后再按另一列聚类?
在我的例子中,我在一个有数百万行的表中有一个< code>month列和一个< code>cust_id列。我可以说,当我将数据帧保存到hive表中,以便根据月份将该表分区,并按< code>cust_id将该表聚类成50个文件吗?
忽略按< code>cust_id的聚类,这里有三个不同的选项
df.write.partitionBy("month").saveAsTable("tbl")
df.repartition(100).write.partitionBy("month").saveAsTable("tbl")
df.repartition("month").write.saveAsTable("tbl")
第一种情况和最后一种情况在 Spark 的功能上相似,但我认为它只是在 Hive(文件夹而不是每个月的文件)中以不同的方式写入数据。
在第二个选项中,重新分区由< code>partitionBy撤消,不是吗?
我怎样才能至少避免这种情况?
通过在Spark中指定多个桶,甚至可以通过高基数列来进行重新分区吗?
只是为了让其他不想修补或编写 SQL 插入语句的人知道,但是在数据帧上使用重新分区
然后使用 partitionBy
实际上可以按照我想要的方式工作,而不是按照我的预期工作。
也就是说,它首先按键分区,然后再按数字重新分区。
示例:
df.repartition(100).write.partitionBy("month").saveAsTable("tbl")
在每个分区内生成100个大小大致相等的文件,其中为hive上的结果表中每个月的不同值创建了一个文件夹(分区)。
我们有没有可能在Spark中先按一列分区,然后再按另一列聚类?
这是可能的,但重新分区
在这里对您没有帮助。
df.write
.partitionBy("month")
.clusterBy(50, "id")
.saveAsTable("tbl")
相当于:
CREATE TABLE users_bucketed_and_partitioned(
month T,
id U
) USING parquet
PARTITIONED BY (month)
CLUSTERED BY(id) INTO 50 BUCKETS;
请纠正它与 Hive 不兼容,并且似乎具有如此意想不到的性能影响。
有人能解释一下将为Spark Dataframe创建的分区数量吗。 我知道对于RDD,在创建它时,我们可以提到如下分区的数量。 但是对于创建时的Spark数据帧,看起来我们没有像RDD那样指定分区数量的选项。 我认为唯一的可能性是,在创建数据帧后,我们可以使用重新分区API。 有人能告诉我在创建数据帧时,我们是否可以指定分区的数量。
我需要使用 spark-sql 加载一个 Hive 表,然后对其运行一些机器学习算法。我是这样写的: 它工作得很好,但如果我想增加数据集数据帧的分区数,我该怎么做?使用普通RDD,我可以写: 我想要有N个分区。 谢谢
我正在查看代码中的一个错误,其中一个数据框被分成了太多的分区(超过700个),当我试图将它们重新分区为48个时,这会导致太多的洗牌操作。我不能在这里使用coalesce(),因为我想在重新分区之前首先拥有更少的分区。 我正在寻找减少分区数量的方法。假设我有一个 spark 数据帧(具有多个列),分为 10 个分区。我需要根据其中一列进行 orderBy 转换。完成此操作后,生成的数据帧是否具有相同
我需要根据一些共享的键列将许多数据帧连接在一起。对于键值RDD,可以指定一个分区程序,以便具有相同键的数据点被洗牌到相同的执行器,因此连接更有效(如果在之前有与洗牌相关的操作)。可以在火花数据帧或数据集上做同样的事情吗?
我一直在使用SE上发布的问题的一个极好的答案来确定分区的数量,以及跨数据帧的分区分布需要知道数据帧Spark中的分区详细信息 有人能帮我扩展答案来确定数据帧的分区大小吗? 谢谢
我需要spark(scala)数据帧分区方面的帮助。我需要按一个键列划分成n个分区,与同一个键相关的所有行都应该在同一个分区中(即,键不应该分布在整个分区中) 注意:我的钥匙可能有几百万 例如:假设我有下面的数据框 等等等等 正如您所看到的,许多值共享相同的键。我想将此数据集划分为"n"个分区,其中相同的键应该在相同的分区中,并且键不应该分布在分区之间。多个键驾驶室位于同一分区,键不可排序。 提前