【问题标题】:Apache Zeppelin Python UDF into SQLApache Zeppelin Python UDF 转换为 SQL
【发布时间】:2017-11-21 22:18:39
【问题描述】:

我正在尝试获取我在 python 中编写的函数,以将新列添加到 SQL 表中。我不知道如何将 UDF 从该函数传递到 SQL 表。我相信做到这一点的方法是withColumn,我只是不知道该怎么做。

目标是从 SQL 表中获取日/周/年,并根据给定数据计算月份。如果我将日/周/年设置为等于值,则以下功能有效。

这里是函数:

def getmonth(day,week,year):
x = datetime.strptime('{}_{}_{}{}'.format(day,week,year,-0), '%d_%W_%Y%w')
month = x.strftime('%m')
udf(getmonth)

SQL...

DriveConfig = sqlContext.sql(""" 
SELECT 
daymade as day,
weekmade as week,
yearmade as year  
FROM datatable2  """)

这是我的表格大致的样子,我想添加介于周和年之间的月份列

day week year 2 42 2017 3 2 2011 1 14 2005 ...

【问题讨论】:

  • 这里真正的挑战是您没有将日期存储为日期。相反,您将所有组件相互独立地存储。您可以轻松地使用 DATEADD 从您发布的数据中完成此操作。

标签: python sql-server apache-zeppelin


【解决方案1】:
def getmonth(day,week,year):
    x = datetime.strptime('{}_{}_{}{}'.format(day,week,year,-0), '%d_%W_%Y%w')
    month = x.strftime('%m')
    return udf(month)

month = udf(getmonth, IntegerType())

DriveConfig = DriveConfig.withColumn("month", month(DriveConfig.day, DriveConfig.week, DriveConfig.year))

【讨论】:

    【解决方案2】:

    类似的东西。我更改了列名,因为应避免使用保留字,因为它们会引起混淆并且更难以使用。

    DECLARE @Something TABLE
    (
        MyDay INT
        , MyWeek INT
        , MyYear INT
    )
    
    INSERT @Something
    (
        MyDay,
        MyWeek,
        MyYear
    )
    VALUES
    (2, 42, 2017)
    ,(3, 2, 2011)
    , (1, 14, 2005)
    
    
    SELECT DATEADD(day, MyDay, DATEADD(WEEK, MyWeek, CONVERT(CHAR(4), MyYear) + '0101'))
    FROM @Something
    

    【讨论】:

      猜你喜欢
      • 2020-02-13
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      相关资源
      最近更新 更多