[英]pyspark group and split dataframe
我正在尝试过滤,然后将数据集分成两个单独的文件。
数据集:test.txt(架构:uid,prod,score)
1 XYZ 2.0
2 ABC 0.5
1 PQR 1.0
2 XYZ 2.1
3 PQR 0.5
1 ABC 0.5
首先,我要过滤任何小于或等于1个乘积的uid。 我已经通过以下代码实现了这一点。
from pyspark.sql.types import *
from pyspark.sql.functions import *
rdd = sc.textFile('test.txt').map(lambda row: row.split('\t'))
schema = StructType([
StructField('uid', IntegerType(), True),
StructField('prod', StringType(), True),
StructField('score', FloatType(), True)])
df = rdd.toDF([f.name for f in schema.fields])
filtered = df.groupby('uid').count().withColumnRenamed("count", "n").filter("n >= 2")
all_data = df.join(filtered, df.uid == filtered.uid , 'inner').drop(filtered.uid).drop(filtered.n)
all_data.show()
这将产生以下输出:
+----+-----+---+
|prod|score|uid|
+----+-----+---+
| XYZ| 2.0| 1|
| PQR| 1.0| 1|
| ABC| 0.5| 1|
| ABC| 0.5| 2|
| XYZ| 2.1| 2|
+----+-----+---+
我现在需要从上述数据框中创建2个文件。 我现在面临的问题是,对每种产品排一行(可以是任何行)并将其放在不同的文件(val.txt)中,而将其余的行放在不同的文件(火车中)的最佳方法是什么。文本)。
预期输出(train.txt)
1 XYZ 2.0
1 PQR 1.0
2 ABC 0.5
预期输出(val.txt)
1 ABC 0.5
2 XYZ 2.1
提前致谢 !
我认为这里的关键问题是您没有数据的主键。
all_data = all_data.withColumn(
'id',
monotonically_increasing_id()
)
train = all_data.dropDuplicates(['prod'])
# could OOM if your dataset is too big
# consider BloomFilter if so
all_id = {row['id'] for row in all_data.select('id').collect()}
train_id = {row['id'] for row in train.select('id').collect()}
val_id = all_id - train_id
val = all_data.where(col(id).isin(val_id))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.