有没有办法在PySpark中执行强制转换或withColumn数据框操作而不破坏功能链?

JHi*_*son 3 python apache-spark apache-spark-sql pyspark

我喜欢使用的东西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()
Run Code Online (Sandbox Code Playgroud)

值得注意的是,在演唱会中演出非常有效filter.不幸的是,它似乎没有withColumngroupBy支持那种字符串api.我试过这样做

.withColumn('newColumn','cast(oldColumn as date)')
Run Code Online (Sandbox Code Playgroud)

但只是因为没有通过以下实例而被大吼column:

assert isinstance(col, Column), "col should be Column"
Run Code Online (Sandbox Code Playgroud)

这是我试图做同样的事情时遇到的完全相同的问题 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()
Run Code Online (Sandbox Code Playgroud)

use*_*411 5

你可以使用col功能:

from pyspark.sql.functions import col

...
    .withColumn('newColumn', col('oldColumn').cast('date'))
Run Code Online (Sandbox Code Playgroud)

或者expr:

from pyspark.sql.functions import expr

...
    .withColumn('newColumn', expr('cast(oldColumn as date)'))
Run Code Online (Sandbox Code Playgroud)