2017-06-19 11 views
1

私はPythonでSQLテーブルに新しい列を追加するために書いた関数を取得しようとしています。私はその関数からSQLテーブルにUDFを渡す方法を理解できません。私はこれを行う方法はの列と信じて、私はちょうど方法を知らない。Apache Zeppelin Python 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