2016-03-18 30 views
3

文字列として日付で構成される列を持つ日付フレームがあるとします。その仮定のために、私たちは一例として、次のデータフレームを作成:上記のコードでdate_format()PySpark関数の結果がnullになるのはなぜですか?

# Importing sql types 
from pyspark.sql.types import StringType, IntegerType, StructType, StructField, DoubleType, FloatType, DateType 
from pyspark.sql.functions import date_format 
import random 
import time 

def strTimeProp(start, end, format, prop): 
    stime = time.mktime(time.strptime(start, format)) # Parse a string representing a time according to a format 
    etime = time.mktime(time.strptime(end, format)) 
    ptime = stime + prop * (etime - stime) 
    return time.strftime(format, time.localtime(ptime)) 

def randomDate(start, end, prop): 
    return strTimeProp(start, end, '%m-%d-%Y', prop) 

# Creación de un dataframe de prueba: 
schema = StructType(
     [ 
    StructField("dates1", StringType(), True), 
     StructField("dates2", StringType(), True) 
    ] 
) 

size = 32 
numCol1 = [str(randomDate("1-1-1991", "1-1-1992", random.random())) for number in range(size)] 
numCol2 = [str(randomDate("1-1-1991", "1-1-1992", random.random())) for number in range(size)] 
# Building dataFrame: 
sqlContext = SQLContext(sc) 
df = sqlContext.createDataFrame(list(zip(numCol1, numCol2)),schema=schema) 
df.show(5) 

、ランダムな日付列が生成され、ここでの例です:

私がやろうとしています何
+----------+----------+ 
| dates1| dates2| 
+----------+----------+ 
|12-21-1991|05-30-1991| 
|05-28-1991|01-23-1991| 
|03-01-1991|08-05-1991| 
|07-15-1991|05-13-1991| 
|07-21-1991|11-10-1991| 
+----------+----------+ 

(pySparkのドキュメントから)次のコードで日付形式を変更することです:

# Changing date formats: 
df.select(date_format('dates1', 'MM-dd-yyy').alias('newFormat')).show(5) 

しかし、私はこの悪い結果を得る:

+---------+ 
|newFormat| 
+---------+ 
|  null| 
|  null| 
|  null| 
|  null| 
|  null| 
+---------+ 

私は文字列dataTypeに関連している問題があると思うが、同時に、なぜこのコードがうまく動作していないのか理解できない。

fechas = ['1000-01-01', '1000-01-15'] 
df = sqlContext.createDataFrame(list(zip(fechas, fechas)), ['dates', 'd']) 
df.show() 

# Changing date formats: 
df.select(date_format('dates', 'MM-dd-yyy').alias('newFormat')).show() 

出力:

+----------+----------+ 
|  dates|   d| 
+----------+----------+ 
|1000-01-01|1000-01-01| 
|1000-01-15|1000-01-15| 
+----------+----------+ 

+----------+ 
| newFormat| 
+----------+ 
|01-01-1000| 
|01-15-1000| 
+----------+ 

この最後の結果は、私が欲しいものです。

+0

MM-dd-yyy以外のMM-dd-yyyyにする必要がありますか? – haifzhan

答えて

6

あなたのデータが日付を返すNULLへの有効なISO 8601表現とキャストではありませんので、それは動作しません:

​​ :

sqlContext.sql("SELECT CAST('12-21-1991' AS DATE)").show() 
## +----+ 
## | _c0| 
## +----+ 
## |null| 
## +----+ 

は、あなたが最初のカスタムフォーマットを使用してデータを解析する必要があります

関連する問題