Saya ingin menambahkan kolom dalam DataFrame
dengan nilai arbitrer (sama untuk setiap baris). Saya mendapatkan kesalahan saat menggunakan withColumn
sebagai berikut:
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'
Tampaknya saya bisa mengelabui fungsi agar berfungsi seperti yang saya inginkan dengan menambahkan dan mengurangi salah satu kolom lainnya (jadi itu menambah nol) dan kemudian menambahkan angka yang saya inginkan (10 dalam kasus ini):
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)]
Ini sangat hacky, bukan? Saya berasumsi ada cara yang lebih sah untuk melakukan ini?
sumber
for i in range(len(item)) : df.withColumn('new_column', lit({}).format(i))
tetapi ini tidak berhasilDi percikan 2.2 ada dua cara untuk menambahkan nilai konstan dalam kolom di DataFrame:
1) Menggunakan
lit
2) Menggunakan
typedLit
.Perbedaan antara keduanya adalah yang
typedLit
juga dapat menangani tipe scala yang diparameterisasi misalnya Daftar, Seq, dan PetaContoh DataFrame:
1) Menggunakan
lit
: Menambahkan nilai string konstan di kolom baru bernama newcol:Hasil:
2) Menggunakan
typedLit
:Hasil:
sumber