将变量传递给Spark DF点亮功能

时间:2019-02-13 10:47:33

标签: python dataframe pyspark

我正在尝试将新列添加到现有的spark df。如果我将df列名称指定为新列的新值,则它会起作用,但是由于我希望value列基于配置是动态的,因此我想从变量中传递值。

例如:

>>> df1.printSchema()
root
 |-- COL_A: string (nullable = true)
 |-- COL_B: string (nullable = true)
 |-- COL_C: string (nullable = true)

如果我使用df2 = df1.withColumn("COL_D", lit(df1.COL_A)),那么它将按预期工作。 但是,如果我有变量并尝试通过它,那它将不起作用。

val_col = "COL_B"

df2 = df1.withColumn("COL_D", lit(df1.val_col))

我不确定这是否可行,但想问一下。让我知道以前是否有人做过类似的事情。

1 个答案:

答案 0 :(得分:1)

使用col函数可以避免此问题。

df = sqlContext.createDataFrame([(1,'Björn'),(2,'Oliver'),(3,'Müller')],['ID','Name']) 
df.show() 
+---+------+
| ID|  Name|
+---+------+
|  1| Björn|
|  2|Oliver|
|  3|Müller|
+---+------+                                  
df1 = df.withColumn('New_ID',lit(df.ID))
df1.show()
+---+------+------+
| ID|  Name|New_ID|
+---+------+------+
|  1| Björn|     1|
|  2|Oliver|     2|
|  3|Müller|     3|
+---+------+------+

到目前为止还不错。但是,当我们为变量分配列名时,就会出现错误,如下所示-

val_col = "ID"
df1 = df.withColumn('New_ID',lit(df.val_col))

AttributeErrorTraceback (most recent call last)
<ipython-input-48-1bb287cfa9f2> in <module>
      5 
      6 val_col = "ID"
----> 7 df1 = df.withColumn('New_ID',lit(df.val_col))
      8 
      9 from pyspark.sql.functions import col

/opt/mapr/spark/spark-2.2.1/python/pyspark/sql/dataframe.py in __getattr__(self, name)
   1018         if name not in self.columns:
   1019             raise AttributeError(
-> 1020                 "'%s' object has no attribute '%s'" % (self.__class__.__name__, name))
   1021         jc = self._jdf.apply(name)
   1022         return Column(jc)

AttributeError: 'DataFrame' object has no attribute 'val_col'

您会收到此错误,因为没有名为val_col的变量,并且Python假定点后的内容为列名。本身不需要字符串。

解决方案:您可以通过导入col函数并使用它来执行操作来共同避免此问题。

from pyspark.sql.functions import col
val_col = "ID"
df1 = df.withColumn('New_ID',lit(col(val_col)))
df1.show()
+---+------+------+
| ID|  Name|New_ID|
+---+------+------+
|  1| Björn|     1|
|  2|Oliver|     2|
|  3|Müller|     3|
+---+------+------+