apache spark - تحويل سلسلة pyspark إلى تنسيق التاريخ




apache-spark apache-spark-sql (4)

جرب هذا:

df = spark.createDataFrame([('2018-07-27 10:30:00',)], ['Date_col'])
df.select(from_unixtime(unix_timestamp(df.Date_col, 'yyyy-MM-dd HH:mm:ss')).alias('dt_col'))
df.show()
+-------------------+  
|           Date_col|  
+-------------------+  
|2018-07-27 10:30:00|  
+-------------------+  

لديّ قاعدة بيانات pyspark للتاريخ مع عمود سلسلة بتنسيق MM-dd-yyyy وأنا أحاول تحويل هذا إلى عمود تاريخ.

حاولت:

df.select(to_date(df.STRING_COLUMN).alias('new_date')).show()

وأحصل على سلسلة من القيم الخالية. هل أستطيع مساعدتك؟


ربما ليس هناك الكثير من الإجابات التي تفكر في مشاركة الكود الذي يمكن أن يساعد شخص ما

from pyspark.sql import SparkSession
from pyspark.sql.functions import to_date

spark = SparkSession.builder.appName("Python Spark SQL basic example")\
    .config("spark.some.config.option", "some-value").getOrCreate()


df = spark.createDataFrame([('2019-06-22',)], ['t'])
df1 = df.select(to_date(df.t, 'yyyy-MM-dd').alias('dt'))
print df1
print df1.show()

انتاج

DataFrame[dt: date]
+----------+
|        dt|
+----------+
|2019-06-22|
+----------+

رمز أعلاه لتحويل إلى تاريخ إذا كنت ترغب في تحويل وقت ، ثم استخدم to_timestamp. اخبرني ان كان لديك اي شك.


من الممكن (الأفضل؟) القيام بذلك دون udf:

from pyspark.sql.functions import unix_timestamp, from_unixtime

df = spark.createDataFrame(
    [("11/25/1991",), ("11/24/1991",), ("11/30/1991",)], 
    ['date_str']
)

df2 = df.select(
    'date_str', 
    from_unixtime(unix_timestamp('date_str', 'MM/dd/yyy')).alias('date')
)

print(df2)
#DataFrame[date_str: string, date: timestamp]

df2.show(truncate=False)
#+----------+-------------------+
#|date_str  |date               |
#+----------+-------------------+
#|11/25/1991|1991-11-25 00:00:00|
#|11/24/1991|1991-11-24 00:00:00|
#|11/30/1991|1991-11-30 00:00:00|
#+----------+-------------------+

تحديث (1/10/2018):

بالنسبة إلى Spark 2.2+ ، فإن أفضل طريقة للقيام بذلك هي على الأرجح استخدام to_date أو to_timestamp ، وكلاهما يدعم وسيطة format . من المستندات:

>>> df = spark.createDataFrame([('1997-02-28 10:30:00',)], ['t'])
>>> df.select(to_timestamp(df.t, 'yyyy-MM-dd HH:mm:ss').alias('dt')).collect()
[Row(dt=datetime.datetime(1997, 2, 28, 10, 30))]

نهج strptime () لا يعمل بالنسبة لي. أحصل على حل أكثر نظافة ، باستخدام طاقم العمل

from pyspark.sql.types import DateType
spark_df1 = spark_df.withColumn("record_date",spark_df['order_submitted_date'].cast(DateType()))
#below is the result
spark_df1.select('order_submitted_date','record_date').show(10,False)

+---------------------+-----------+
|order_submitted_date |record_date|
+---------------------+-----------+
|2015-08-19 12:54:16.0|2015-08-19 |
|2016-04-14 13:55:50.0|2016-04-14 |
|2013-10-11 18:23:36.0|2013-10-11 |
|2015-08-19 20:18:55.0|2015-08-19 |
|2015-08-20 12:07:40.0|2015-08-20 |
|2013-10-11 21:24:12.0|2013-10-11 |
|2013-10-11 23:29:28.0|2013-10-11 |
|2015-08-20 16:59:35.0|2015-08-20 |
|2015-08-20 17:32:03.0|2015-08-20 |
|2016-04-13 16:56:21.0|2016-04-13 |




pyspark-sql