Python Spark DataFrame TimestampType-如何从字段中获取年、月、日值?
我有一个Spark数据框,上面有5行,如下所示:Python Spark DataFrame TimestampType-如何从字段中获取年、月、日值?,python,timestamp,apache-spark,pyspark,Python,Timestamp,Apache Spark,Pyspark,我有一个Spark数据框,上面有5行,如下所示: [Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=1, value=638.55), Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=2, value=638.55), Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=3, value=638.55), Row(date=datet
[Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=1, value=638.55),
Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=2, value=638.55),
Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=3, value=638.55),
Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=4, value=638.55),
Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=5, value=638.55)]
其模式定义为:
elevDF.printSchema()
root
|-- date: timestamp (nullable = true)
|-- hour: long (nullable = true)
|-- value: double (nullable = true)
如何从“日期”字段中获取年、月、日值?自Spark 1.5以来,您可以使用多种日期处理功能:
您可以像使用任何其他RDD一样使用简单的
map
:
elevDF = sqlContext.createDataFrame(sc.parallelize([
Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=1, value=638.55),
Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=2, value=638.55),
Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=3, value=638.55),
Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=4, value=638.55),
Row(date=datetime.datetime(1984, 1, 1, 0, 0), hour=5, value=638.55)]))
(elevDF
.map(lambda (date, hour, value): (date.year, date.month, date.day))
.collect())
结果是:
[(1984, 1, 1), (1984, 1, 1), (1984, 1, 1), (1984, 1, 1), (1984, 1, 1)]
顺便说一句:
datetime.datetime无论如何都会存储一个小时,所以单独保存它似乎是浪费内存 您可以在pyspark.sql.functions
中使用函数:诸如年
,月
,等函数
请参阅此处:
实际上,我们真的不需要导入任何python库。我们可以使用简单的SQL分隔年、月、日。参见下面的示例
+----------+
| _c0|
+----------+
|1872-11-30|
|1873-03-08|
|1874-03-07|
|1875-03-06|
|1876-03-04|
|1876-03-25|
|1877-03-03|
|1877-03-05|
|1878-03-02|
|1878-03-23|
|1879-01-18|
我的数据框中有一个日期列,其中包含日期、月份和年份,并假设我只想从该列中提取年份
df.createOrReplaceTempView("res")
sqlDF = spark.sql("SELECT EXTRACT(year from `_c0`) FROM res ")
在这里,我创建了一个临时视图,并使用这一行存储年份值,输出为
+-----------------------+
|year(CAST(_c0 AS DATE))|
+-----------------------+
| 1872|
| 1873|
| 1874|
| 1875|
| 1876|
| 1876|
| 1877|
| 1877|
| 1878|
| 1878|
| 1879|
| 1879|
| 1879|
好的,谢谢你,以前它对我不起作用,但是现在让它与elevDF.map(lambda(date,value):(date.year,value))
谢谢!正是我需要的。对于未来的读者,请注意,这只适用于Spark>=3.0
df.createOrReplaceTempView("res")
sqlDF = spark.sql("SELECT EXTRACT(year from `_c0`) FROM res ")
+-----------------------+
|year(CAST(_c0 AS DATE))|
+-----------------------+
| 1872|
| 1873|
| 1874|
| 1875|
| 1876|
| 1876|
| 1877|
| 1877|
| 1878|
| 1878|
| 1879|
| 1879|
| 1879|