Comment ajouter une colonne constante dans une Étincelle DataFrame?
Je veux ajouter une colonne dans une DataFrame
avec une certaine valeur arbitraire (qui est la même pour chaque ligne). J'obtiens une erreur lorsque j'utilise withColumn
comme suit:
dt.withColumn('new_column', 10).head(5)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-50-a6d0257ca2be> in <module>()
1 dt = (messages
2 .select(messages.fromuserid, messages.messagetype, floor(messages.datetime/(1000*60*5)).alias("dt")))
----> 3 dt.withColumn('new_column', 10).head(5)
/Users/evanzamir/spark-1.4.1/python/pyspark/sql/dataframe.pyc in withColumn(self, colName, col)
1166 [Row(age=2, name=u'Alice', age2=4), Row(age=5, name=u'Bob', age2=7)]
1167 """
-> 1168 return self.select('*', col.alias(colName))
1169
1170 @ignore_unicode_prefix
AttributeError: 'int' object has no attribute 'alias'
Il semble que j'ai peut tromper la fonction dans le travail que je veux en ajoutant et en soustrayant l'un des autres colonnes (de sorte qu'ils ajoutent à zéro), puis en ajoutant le nombre je veux (10 dans ce cas):
dt.withColumn('new_column', dt.messagetype - dt.messagetype + 10).head(5)
[Row(fromuserid=425, messagetype=1, dt=4809600.0, new_column=10),
Row(fromuserid=47019141, messagetype=1, dt=4809600.0, new_column=10),
Row(fromuserid=49746356, messagetype=1, dt=4809600.0, new_column=10),
Row(fromuserid=93506471, messagetype=1, dt=4809600.0, new_column=10),
Row(fromuserid=80488242, messagetype=1, dt=4809600.0, new_column=10)]
Cela est particulièrement hacky, droit? Je suppose que il est plus légitime façon de le faire?
Vous devez vous connecter pour publier un commentaire.
Étincelle 2.2+
Étincelle 2.2 introduit
typedLit
à l'appui deSeq
,Map
, etTuples
(SPARK-19254) et les appels suivants doivent être pris en charge (la Scala):Étincelle 1.3+ (
lit
), 1.4+ (array
,struct
), 2.0+ (map
):Le deuxième argument pour
DataFrame.withColumn
devrait être unColumn
, donc vous devez utiliser un littéral:Si vous avez besoin de complexe de colonnes que vous pouvez construire à l'aide de blocs comme
array
:Exactement les mêmes méthodes peuvent être utilisées en Scala.
De fournir des noms pour
structs
utiliseralias
sur chaque champ:ou
cast
sur l'ensemble de l'objetIl est également possible, bien que plus lente, pour utiliser un UDF.
Note:
Les mêmes constructions peuvent être utilisés pour transmettre constante des arguments de fonctions définies par l'utilisateur ou des fonctions SQL.
Spark 2.2 il y a deux façons d'ajouter de la valeur de la constante dans une colonne de DataFrame:
1) à l'Aide de
lit
2) à l'Aide de
typedLit
.La différence entre les deux est que
typedLit
pouvez également gérer paramétrée scala par exemple, les types de Liste, Seq, et la CarteExemple de DataFrame:
1) à l'Aide de
lit
: l'Ajout constant de la chaîne de valeur dans la nouvelle colonne nommée newcol:Résultat:
2) à l'Aide de
typedLit
:Résultat: