2017-06-19 55 views
1

我想獲得一個函數,我在python中添加一個新的列到SQL表中。我無法弄清楚如何將UDF從該函數傳遞到SQL表。我相信這樣做的方式是withColumn,我只是不知道該怎麼做。Apache Zeppelin蟒蛇UDF到SQL

目標是從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 ...

+0

這裏真正的挑戰是,你是不是存儲日期爲日期。而是將所有組件彼此獨立存儲。您可以輕鬆使用DATEADD從發佈的數據中完成此操作。 –

回答

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

東西沿着這些線。我更改了列名,因爲應該避免使用保留字,因爲它們會導致混淆,並且更難於處理。

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