スパーク> = 2.2
あなたはunix_timestamp
とキャストをスキップしてto_date
またはto_timestamp
を使用することができます。
from pyspark.sql.functions import to_date, to_timestamp
df_test.withColumn("date", to_date("date", "dd-MMM-yy")).show()
## +---+----------+
## | id| date|
## +---+----------+
## | 1|2015-07-14|
## | 2|2015-06-14|
## | 3|2015-10-11|
## +---+----------+
df_test.withColumn("date", to_timestamp("date", "dd-MMM-yy")).show()
## +---+-------------------+
## | id| date|
## +---+-------------------+
## | 1|2015-07-14 00:00:00|
## | 2|2015-06-14 00:00:00|
## | 3|2015-10-11 00:00:00|
## +---+-------------------+
し、他のdatetを適用しますime関数を以下に示します。
スパーク< 2.2
単一のアクセスに複数のトップレベル列を導出することはできません。
from pyspark.sql.types import StringType, StructType, StructField
from pyspark.sql import Row
from pyspark.sql.functions import udf, col
schema = StructType([
StructField("day", StringType(), True),
StructField("month", StringType(), True),
StructField("year", StringType(), True)
])
def split_date_(s):
try:
d, m, y = s.split("-")
return d, m, y
except:
return None
split_date = udf(split_date_, schema)
transformed = df_test.withColumn("date", split_date(col("date")))
transformed.printSchema()
## root
## |-- id: long (nullable = true)
## |-- date: struct (nullable = true)
## | |-- day: string (nullable = true)
## | |-- month: string (nullable = true)
## | |-- year: string (nullable = true)
が、それだけではなく、かなりPySparkで冗長でなく、高価である:あなたはこのようなUDFで構造体やコレクション型を使用することができます。日付ベースの変換のために
あなたは単に組み込み関数を使用することができます。
from pyspark.sql.functions import unix_timestamp, dayofmonth, year, date_format
transformed = (df_test
.withColumn("ts",
unix_timestamp(col("date"), "dd-MMM-yy").cast("timestamp"))
.withColumn("day", dayofmonth(col("ts")).cast("string"))
.withColumn("month", date_format(col("ts"), "MMM"))
.withColumn("year", year(col("ts")).cast("string"))
.drop("ts"))
同様に、あなたは、日付文字列を分割するregexp_extract
を使用することができます。
もDerive multiple columns from a single column in a Spark DataFrame
注参照してください:あなたはSPARK-11724に対してパッチを当てていないバージョンを使用している場合
これはunix_timestamp(...)
後とcast("timestamp")
前に修正が必要になります。
spark 2.xのこの回答が更新されているのだろうか。ありがとう! – Kai
@Kai Spark 2.2では 'unix_timestamp'をスキップできますが、これが唯一の重要な変更です。残りはほぼ同じですが、SQL関数が推奨されています。 – zero323
速い返信をいただきありがとうございます。 – Kai