我有一个Spark数据框(我正在使用pyspark)'orders'。它具有以下各列
['id', 'orderdate', 'customerid', 'status']
我正在尝试使用键列作为'状态'进行分层随机抽样。我的目标如下
>> create a new dataframe with exactly 5 random records per status
所以我选择的方法是使用.sampleBy('strata_key',{fraction_dict})。但是我面临的挑战是为每个状态选择确切的分数值,这样每次我应该为每个状态准确获得5条随机记录。我已经按照下面的方法
1。为每个状态的总数创建字典,如下所示
#Total count of records for each order 'status' in 'ORDERS' dataframe is as below
d=dict([(x['status'],x['count']) for x in orders.groupBy("status").count().collect()])
print(d)
输出:
{'PENDING_PAYMENT': 15030, 'COMPLETE': 22899, 'ON_HOLD': 3798, 'PAYMENT_REVIEW': 729, 'PROCESSING': 8275, 'CLOSED': 7556, 'SUSPECTED_FRAUD': 1558,
'PENDING': 7610, 'CANCELED': 1428}
2。创建了一个函数,该函数生成获取精确的N条记录所需的分数值
#Exact number of records needed per status
N=5
#function calculates fraction
def fraction_calc(count_dict,N)
d_mod={}
for i in d:
d_mod[i]=(N/d[i])
return d_mod
#creating dictionary of fractions using above function
fraction=fraction_calc(d,5)
print(fraction)
输出:
{'PENDING_PAYMENT': 0.00033266799733865603, 'COMPLETE': 0.000218350146294598, 'ON_HOLD': 0.0013164823591363876, 'PAYMENT_REVIEW': 0.006858710562414266, 'PROCESSING': 0.0006042296072507553, 'CLOSED': 0.0006617257808364214, 'SUSPECTED_FRAUD': 0.003209242618741977, 'PENDING': 0.000657030223390276, 'CANCELED': 0.0035014005602240898}
3。创建使用起始采样API .sampleBy()进行采样的最终数据帧。
#creating final sampled dataframe df_sample=orders.sampleBy("status",fraction)
但是我仍然没有获得每个状态准确的5条记录。示例输出如下
#Checking count per status of resultant sample dataframe df_sample.groupBy("status").count().show() +---------------+-----+ | status|count| +---------------+-----+ |PENDING_PAYMENT| 3| | COMPLETE| 6| | ON_HOLD| 7| | PAYMENT_REVIEW| 4| | PROCESSING| 6| | CLOSED| 6| |SUSPECTED_FRAUD| 7| | PENDING| 9| | CANCELED| 5| +---------------+-----+
我在这里应该怎么实现我的目标。
我有一个spark数据框(我正在使用pyspark)“订单”。它有以下几列['id','orderdate','customerid','status']我正在尝试使用键...
找到了解决方法