java—基于spark数据集中的列对数据进行分组后的示例数据

iyr7buue  于 2021-05-24  发布在  Spark
关注(0)|答案(1)|浏览(455)

我有一个spark数据集,格式如下:

Id dataset

id1,[name1,name2,name3...name100]
id2,[name1,name2,name3,nam4....name100000]
id3,[name1,name2,name3.....name1000]

我想为每个id随机抽取50%的名称样本。我知道spark有一个sample函数。但是我可以根据数据集的每一行将百分比传递给它吗?每一行的名称计数将不同。
这就是我尝试过的:

WindowSpec window = Window.partitionBy(col("id")).orderBy(functions.rand());

 idDataset.select(col("name"), functions.rank().over(window).alias("rank"))
                .filter(functions.col("rank") = .05 ).drop("rank");

这里的0.05意味着我需要为每个id随机抽取50%的名字样本。

vu8f3i0k

vu8f3i0k1#

一种选择是使用内置的sql函数。
您可以使用transform为每个名称指定一个介于0.0和1.0之间的随机值,然后过滤掉随机数大于阈值(本例中为0.5)的所有名称。

import static org.apache.spark.sql.functions.*;

df.withColumn("sampled",
       expr("filter(transform(names, n -> (n, rand())), n -> n.col2 <= 0.5).n"))
  .show(false);

输出:

+---+------------------------------------------+----------------------------+
|id |names                                     |sampled                     |
+---+------------------------------------------+----------------------------+
|id1|[name1, name2, name3, name4]              |[name3]                     |
|id2|[name1, name2, name3, name4, name5, name6]|[name1, name2, name5, name6]|
|id3|[name1, name2, name3]                     |[name1, name2]              |
+---+------------------------------------------+----------------------------+

相关问题