2016-03-18 155 views
3

假設有一個包含日期字符串的日期框。對於這樣的假設,我們創建了以下數據幀爲例:爲什麼我會從date_format()PySpark函數中得到空結果?

# 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| 
+---------+ 

我想有一個問題涉及與string數據類型,但在同一時間,我不明白爲什麼上面這段代碼波紋管工作和代碼沒有。

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-yyyy而不是MM-dd-yyy嗎? – haifzhan

回答

6

它不工作,因爲你的數據不是一個有效的ISO 8601的代表性和投迄今回報NULL

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

你必須首先使用自定義格式解析數據:

​​
相關問題