J'essaie de prélever des échantillons de deux trames de données dans lesquelles j'ai besoin du ratio de comptage maintenu. par exemple
df1.count() = 10
df2.count() = 1000
noOfSamples = 10
Je veux échantillonner les données de manière à obtenir 10 échantillons de taille 101 chacun (1 de df1 et 100 de df2)
Maintenant en le faisant,
var newSample = df1.sample(true, df1.count() / noOfSamples)
println(newSample.count())
Qu'implique la fraction ici? peut-il être supérieur à 1? J'ai vérifié ceci et ceci mais je n'ai pas été en mesure de le comprendre complètement.
Aussi, y a-t-il de toute façon que nous pouvons spécifier le nombre de lignes à échantillonner?
Pour répondre si la fraction peut être supérieure à 1. Oui, cela peut l'être si nous avons remplacé par oui Si une valeur supérieure à 1 est fournie avec replace false, alors l'exception suivante se produira:
Java.lang.IllegalArgumentException: requirement failed: Upper bound (2.0) must be <= 1.0.
Je trouve moi aussi que le manque de fonctionnalité échantillon par nombre est perturbant. Si vous n'êtes pas pointilleux quant à la création d'une vue temporaire, le code ci-dessous vous sera utile (df correspond à votre cadre de données et compte à la taille de l'échantillon):
val tableName = s"table_to_sample_${System.currentTimeMillis}"
df.createOrReplaceTempView(tableName)
val sampled = sqlContext.sql(s"select *, Rand() as random from ${tableName} order by random limit ${count}")
sqlContext.dropTempTable(tableName)
sampled.drop("random")
Il renvoie un nombre exact tant que le nombre de lignes en cours est égal à la taille de votre échantillon.
Pour répondre à votre question, est-il possible de préciser le nombre de lignes à échantillonner?
J'ai récemment eu besoin d'échantillonner un certain nombre de lignes d'un cadre de données spark. J'ai suivi le processus ci-dessous,
Convertissez le cadre de données d'étincelle en rdd . Exemple: df_test.rdd
RDD a une fonctionnalité appelée takeSample qui vous permet d'indiquer le nombre d'échantillons dont vous avez besoin avec un numéro de graine . Exemple: df_test.rdd.takeSample(withReplacement, Number of Samples, Seed)
Reconvertir RDD en cadre de données spark à l'aide de sqlContext.createDataFrame()
Processus ci-dessus combiné en une seule étape:
La base de données (ou la population) sur laquelle je devais échantillonner contient environ 8 000 enregistrements: Df_grp_1
df_grp_1
test1 = sqlContext.createDataFrame(df_grp_1.rdd.takeSample(False,125,seed=115))
la trame de données test1 aura 125 enregistrements échantillonnés.
Le code ci-dessous fonctionne si vous voulez faire une division aléatoire de 70% & 30% d’une trame de données df,
val Array(trainingDF, testDF) = df.randomSplit(Array(0.7, 0.3), seed = 12345)
J'utilise cette fonction pour l'échantillonnage aléatoire lorsque le nombre exact d'enregistrements est souhaitable:
def row_count_sample (df, row_count, with_replacement=False, random_seed=113170):
ratio = 1.08 * float(row_count) / df.count() # random-sample more as dataframe.sample() is not a guaranteed to give exact record count
# it could be more or less actual number of records returned by df.sample()
if ratio>1.0:
ratio = 1.0
result_df = (df
.sample(with_replacement, ratio, random_seed)
.limit(row_count) # since we oversampled, make exact row count here
)
return result_df