【发布时间】:2017-12-09 15:47:25
【问题描述】:
我有一个非常简单的 CSV,叫它test.csv
name,timestamp,action
A,2012-10-12 00:30:00.0000000,1
B,2012-10-12 01:00:00.0000000,2
C,2012-10-12 01:30:00.0000000,2
D,2012-10-12 02:00:00.0000000,3
E,2012-10-12 02:30:00.0000000,1
我正在尝试使用 pyspark 读取它并添加一个指示月份的新列。
首先我读入数据,一切正常。
df = spark.read.csv('test.csv', inferSchema=True, header=True)
df.printSchema()
df.show()
输出:
root
|-- name: string (nullable = true)
|-- timestamp: timestamp (nullable = true)
|-- action: double (nullable = true)
+----+-------------------+------+
|name| timestamp|action|
+----+-------------------+------+
| A|2012-10-12 00:30:00| 1.0|
| B|2012-10-12 01:00:00| 2.0|
| C|2012-10-12 01:30:00| 2.0|
| D|2012-10-12 02:00:00| 3.0|
| E|2012-10-12 02:30:00| 1.0|
+----+-------------------+------+
但是当我尝试添加我的列时,格式化选项似乎没有任何作用。
df.withColumn('month', to_date(col('timestamp'), format='MMM')).show()
输出:
+----+-------------------+------+----------+
|name| timestamp|action| month|
+----+-------------------+------+----------+
| A|2012-10-12 00:30:00| 1.0|2012-10-12|
| B|2012-10-12 01:00:00| 2.0|2012-10-12|
| C|2012-10-12 01:30:00| 2.0|2012-10-12|
| D|2012-10-12 02:00:00| 3.0|2012-10-12|
| E|2012-10-12 02:30:00| 1.0|2012-10-12|
+----+-------------------+------+----------+
这是怎么回事?
【问题讨论】:
-
你想把它转换成什么?月?
-
是的。根据 Oracle 页面上的文档,MMM 应该可以做到这一点,但我没有尝试过任何格式。 docs.oracle.com/javase/tutorial/i18n/format/…
-
有一个内置函数叫做month spark.apache.org/docs/1.6.2/api/java/org/apache/spark/sql/…
-
@RameshMaharjan 这很有用,我不知道有这样的功能!但是,您会明白这是一个简化的示例,我仍然希望自定义格式正常工作,或者了解它为什么不起作用。
-
您正在做的是基于列的转换,并且上面的链接中还有 to_date 函数,它不采用格式参数。因此它不适合你。我猜你正在寻找的是 udf 函数。
标签: python apache-spark pyspark jupyter-notebook simpledateformat