Spark Dataset API - rejoindre
Je suis en train d'utiliser l'Étincelle Dataset API, mais je vais avoir quelques problèmes faisant une simple jointure.
Disons que j'ai deux jeu de données avec les champs: date | value
, puis dans le cas de DataFrame
mon rejoindre ressemblerait à:
val dfA : DataFrame
val dfB : DataFrame
dfA.join(dfB, dfB("date") === dfA("date") )
Cependant pour Dataset
il est le .joinWith
méthode, mais la même approche ne fonctionne pas:
val dfA : Dataset
val dfB : Dataset
dfA.joinWith(dfB, ? )
Qu'est-ce que l'argument requis par .joinWith
?
OriginalL'auteur mastro | 2016-04-06
Vous devez vous connecter pour publier un commentaire.
À utiliser
joinWith
vous devez d'abord créer unDataSet
, et deux d'entre eux. Pour créer unDataSet
, vous devez créer une classe de cas qui correspond à votre schéma et appelDataFrame.as[T]
oùT
est le cas de la classe. Donc:Vous pouvez aussi sauter le cas de la classe et de l'utilisation d'un n-uplet:
Alors si vous aviez une autre classe de cas /DF, comme ce dire:
Ensuite, bien que la syntaxe de
join
etjoinWith
sont similaires, les résultats sont différents:Comme vous pouvez le voir,
joinWith
laisse les objets intacts comme les pièces d'un tuple, tandis quejoin
s'aplatit les colonnes dans un seul espace de noms. (Ce qui va causer des problèmes dans le cas ci-dessus, parce que le nom de la colonne "clé" est répété.)Curieusement, je dois utiliser
df.col("key")
etdf2.col("key")
à créer les conditions pour rejoindreds
etds2
-- si vous utilisez seulementcol("key")
sur chaque côté, il ne fonctionne pas, etds.col(...)
n'existe pas. À l'aide de l'originaldf.col("key")
fait le truc, cependant.Je suis complètement d'accord, basé sur cette syntaxe n'est pas dans la création du jeu de données, donc où est l'avantage? Je ne peut pas obtenir sur le fait qu'il n'y est pas de type alternative.. dommage!
il y a une solution dans ce réponse de "tapé rejoindre en Scala, avec Spark ensembles de données"
OriginalL'auteur David Griffin
De https://docs.cloud.databricks.com/docs/latest/databricks_guide/05%20Spark/1%20Intro%20Datasets.html
il semble que vous pourriez faire
OriginalL'auteur Raghuram Onti Srinivasan
Dans l'exemple ci-dessus, vous pouvez essayer l'option en dessous -
Définir une classe de cas pour la production de votre
case class JoinOutput(key:Int, value:String, num1:Double, num2:Long)
Joindre deux jeux de données avec les "Seq("clé")", cela vous aidera à éviter la double clé de colonnes dans le résultat. Qui va vous aider à appliquer le cas de la classe ou de récupérer les données dans la prochaine étape,
ds.join(ds2, Seq("key")).as[JoinOutput]
res27: org.apache.spark.sql.Dataset[JoinOutput] = [key: int, value: string ... 2 more fields]
scala> ds.join(ds2, Seq("key")).as[JoinOutput].show
+---+-----+----+----+
|key|value|num1|num2|
+---+-----+----+----+
| 1| asdf| 7.7| 101|
| 2|34234| 1.2| 10|
+---+-----+----+----+
OriginalL'auteur Syntax