我有一个largeDataFrame
(多列和数十亿行)和一个smallDataFrame
(单列和10,000行).
我想所有的行从过滤largeDataFrame
每当some_identifier
列在largeDataFrame
比赛中的行之一smallDataFrame
.
这是一个例子:
largeDataFrame
some_idenfitier,first_name
111,bob
123,phil
222,mary
456,sue
Run Code Online (Sandbox Code Playgroud)
smallDataFrame
some_identifier
123
456
Run Code Online (Sandbox Code Playgroud)
desiredOutput
111,bob
222,mary
Run Code Online (Sandbox Code Playgroud)
这是我丑陋的解决方案.
val smallDataFrame2 = smallDataFrame.withColumn("is_bad", lit("bad_row"))
val desiredOutput = largeDataFrame.join(broadcast(smallDataFrame2), Seq("some_identifier"), "left").filter($"is_bad".isNull).drop("is_bad")
Run Code Online (Sandbox Code Playgroud)
有更清洁的解决方案吗?
我有包含用户和购买数据的数据集.下面是一个示例,其中第一个元素是userId,第二个元素是productId,第三个元素是boolean.
(2147481832,23355149,1)
(2147481832,973010692,1)
(2147481832,2134870842,1)
(2147481832,541023347,1)
(2147481832,1682206630,1)
(2147481832,1138211459,1)
(2147481832,852202566,1)
(2147481832,201375938,1)
(2147481832,486538879,1)
(2147481832,919187908,1)
...
Run Code Online (Sandbox Code Playgroud)
我想确保我只占用每个用户数据的80%并构建RDD,同时占用20%的剩余部分并构建另一个RDD.让我们来电话和测试.我想远离使用groupBy开始,因为它可以创建内存问题,因为数据集很大.什么是最好的方法呢?
我可以做以下但这不会给每个用户80%.
val percentData = data.map(x => ((math.random * 100).toInt, x._1. x._2, x._3)
val train = percentData.filter(x => x._1 < 80).values.repartition(10).cache()
Run Code Online (Sandbox Code Playgroud) 我想从 PySpark 上的数据框中进行分层抽样。有一个sampleBy(col, fractions, seed=None)
功能,但它似乎只使用一列作为层。有没有办法使用多个列作为层?