【发布时间】:2021-05-23 12:27:15
【问题描述】:
我想使用 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, 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,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_date 函数只返回年份?
【问题讨论】:
标签: apache-spark pyspark apache-spark-sql rdd