web-dev-qa-db-fra.com

Exemple de Dataframe dans Apache spark | Scala

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?

14
hbabbar

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.
3
Aanish

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. 

2
Oytun

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,

  1. Convertissez le cadre de données d'étincelle en rdd . Exemple: df_test.rdd

  2. 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)

  3. 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.

2
Pramod Kotla

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)
1
Kirubakar

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 
0
Tagar