我有一个关于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)
感谢您的任何意见!