PySpark / Python / UserDefinedFunction / Redshift - 确保在使用UDF时使用有效的查询计划所需的帮助。

时间:2016-04-12 10:50:10

标签: python pyspark udf

我有一个关于UserDefinedFunctions(udf)和withColumn函数的快速问题,可以将额外的列扩展到现有的SQL数据框上。

作为参考,我正在查询RedShift的数据。

如果我使用本机JVM函数,例如pyspark.sql.functions.lower(调用:org.apache.spark.sql.functions.lower),那么生成的查询很聪明,可以确定从哪个列中获取数据库。

(
    sql_context
    .read
    .format('com.databricks.spark.redshift')
    .option('url', URL)
    .option('dbtable', 'events')
    ...
    .withColumn('abc_lower', lower('abc'))  
    ...
)

# The query is:
('SELECT "abc" FROM events)

当我定义自己的功能时,它并不那么聪明并抓住整个表格。

def foo_bar(abc):
    return abc[:-2]

foobar_udf = udf(foo_bar, StringType())

(
    sql_context
    .read
    .format('com.databricks.spark.redshift')
    .option('url', URL)
    .option('dbtable', 'events')
    ...
    .withColumn('abc_lower', foobar_udf('abc'))  
    ...
)

# The query is:
('SELECT "abc", "and", "every", "other", "column", "..." FROM events)

有关我如何阻止它这样做的任何帮助?

我的一个解决方法是在withColumn之前进行选择,但我宁愿Spark可以找出我需要哪些列而不必说:

(
    sql_context
    .read
    .format('com.databricks.spark.redshift')
    .option('url', URL)
    .option('dbtable', 'events')
    ...
    .select(
        'abc',
        'other',
        'columns',
        'i',
        'want'
    )
    .withColumn('abc_lower', foobar_udf('abc'))  
    ...
)
# The query is:
('SELECT "abc", "other", "columns", "i", "want" FROM events)

感谢您的任何意见!

0 个答案:

没有答案