我喜欢使用 DataFrames 的一点是能够将函数调用链接在一起。我遇到的问题是,我正在努力寻找允许您执行引用 cast 列的 withColumnDataFrame 操作的语法。例如:

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 调用中执行转换效果很好。不幸的是,withColumngroupBy 似乎都不支持那种字符串 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/

10-12 22:58