我喜欢使用 DataFrames
的一点是能够将函数调用链接在一起。我遇到的问题是,我正在努力寻找允许您执行引用 cast
列的 withColumn
或 DataFrame
操作的语法。例如:
counts = sqlContext.read.format("com.databricks.spark.csv") \
.options(header=True) \
.load(path) \
.filter("cast(filterColumn as int) in (8, 11, 12)") \
.withColumn('newColumn',df.oldColumn.cast("date")) \ #<-- df doesn't exist, silly!
.groupBy(df.newColumn) \
.count() \
.collect()
值得注意的是,在
filter
调用中执行转换效果很好。不幸的是,withColumn
或 groupBy
似乎都不支持那种字符串 api。我试过做.withColumn('newColumn','cast(oldColumn as date)')
但只会因为没有传入
column
的实例而被大吼大叫:assert isinstance(col, Column), "col should be Column"
这是我在尝试用
groupBy
做同样的事情时遇到的完全相同的问题我是否只需要硬着头皮把它们拆散?
df = sqlContext.read.format("com.databricks.spark.csv") \
.options(header=True) \
.load(path) \
.filter("cast(filterColumn as int) in (8, 11, 12)")
counts = df.withColumn('newColumn',df.oldColumn.cast("date"))
.groupBy(df.newColumn) \
.count() \
.collect()
最佳答案
您可以使用 col
函数:
from pyspark.sql.functions import col
...
.withColumn('newColumn', col('oldColumn').cast('date'))
或
expr
:from pyspark.sql.functions import expr
...
.withColumn('newColumn', expr('cast(oldColumn as date)'))
关于python - 有没有办法在不破坏函数链的情况下在 PySpark 中执行强制转换或 withColumn 数据帧操作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42102454/