2017-02-08 6 views
2

Что-то мне нравится в работе с DataFrames - это возможность цепочки вызовов функций вместе. Проблема, с которой я сталкиваюсь, заключается в том, что я изо всех сил пытаюсь найти синтаксис, который позволяет вам выполнить операцию cast или withColumn, которая ссылается на столбец DataFrame. Например:Есть ли способ выполнить операцию трансляции cast или withColumn в pyspark без нарушения цепочки функций?

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() 

ответ

4

Вы можете использовать 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)')) 
+1

Это заслуживает WAY больше upvotes. –