使用pyspark在sql查询中从datetime剥离年份

kq4fsx7k  于 2021-07-13  发布在  Spark
关注(0)|答案(1)|浏览(324)

这个问题在这里已经有答案了

spark dataframe timestamptype-如何从字段中获取年、月、日值(3个答案)
两个月前关门了。
我想使用sparksql在csv文件中执行一个简单的查询。我的代码如下:

def format_date(date):
 return date

movies = spark.read.format('csv'). \
                options(header='false',
                inferSchema='true'). \
                load("hdfs://master:9000/movie_data_csv/movies.csv")

movies.registerTempTable("movies")
spark.udf.register("date_formatter", format_date)

sqlString = \
        "select date_formatter(_c3) as Year" + \
        "from movies " + \
        "limit 1"

res = spark.sql(sqlString)

res.show(res.count(),False)

my movies csv文件在第3列中包含一个datetime对象,如下所示:

Row(... _c3=datetime.datetime(1995, 10, 30, 0, 0),...)

我要做的是使用格式\u date return并仅显示“as year”从这个datetime值开始的年份。如果我在查询中使用\u c3,它可以很好地显示整个datetime值。将它传递给函数会产生以下结果:

|java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Athens",offset=7200000,dstSavings=3600000,useDaylight=true,transitions=138,lastRule=java.util.SimpleTimeZone[id=Europe/Athens,offset=7200000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=1972,MONTH=3,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=28,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]|Tout Va Bien|0

有人能给我解释一下这里发生了什么,我怎么能用format\u date函数返回年份呢?

qgelzfjb

qgelzfjb1#

你可以用 year sparksql函数获取年份。无需编写自己的自定义项。

sqlString = \
        "select year(_c3) as Year" + \
        "from movies " + \
        "limit 1"

相关问题