微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用pyspark在sql查询中从日期时间中剥离年份

如何解决使用pyspark在sql查询中从日期时间中剥离年份

我想使用 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)

我的电影 csv 文件在第 3 列中包含一个日期时间对象,如下所示:

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

我想要做的是使用 format_date 返回并仅显示来自此日期时间值的年份“作为年份”。如果我只是在查询中使用 _c3,它可以很好地显示整个日期时间值。不过将它传递给函数产生这个:

|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,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_date 函数返回年份?

解决方法

您只需使用 year Spark SQL 函数即可获取年份。无需编写自己的 UDF。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。