2016-03-18 25 views
3

Dize olarak tarihlerden oluşan bir sütuna sahip bir tarih aralığı olduğunu varsayalım. varsayımına için, bir örnek olarak aşağıdaki dataFrame oluşturun: Yukarıdaki koddaNeden date_format() PySpark işlevinden null sonuçları alıyorum?

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

, rastgele bir tarih sütunu oluşturulur, burada bir örnek:

ben yapmaya çalışıyorum ne
+----------+----------+ 
| 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 belgelerinden) aşağıdaki kodla tarih biçimini değiştirmektir:

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

Ama bu kötü bir sonuç almak:

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

DataType dizesiyle ilgili bir sorun olduğunu varsayalım, ama aynı zamanda bu kodun neden işe yaradığını ve yukarıdaki kodun neden olmadığını anlamıyorum.

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() 

Çıktı:

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

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

Bu son sonuçlar benim istediğim şey.

+0

MM-dd-yyy'den başka MM-dd-yyyy mi? – haifzhan

cevap

6

veri tarih getiri NULL için geçerli bir ISO 8601 temsil ve dökme değil, çünkü çalışmaz:

output_format = ... # Some SimpleDateFormat string 
df.select(date_format(
    unix_timestamp("dates1", "MM-dd-yyyy").cast("timestamp"), 
    output_format 
)) 
:

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

Önce özel bir biçim kullanarak veri ayrıştırmak gerekecek

İlgili konular