Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我从date_format()PySpark函数得到空结果?_Python_Apache Spark_Pyspark - Fatal编程技术网

Python 为什么我从date_format()PySpark函数得到空结果?

Python 为什么我从date_format()PySpark函数得到空结果?,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,假设有一个日期框,其列由日期作为字符串组成。对于该假设,我们创建以下数据帧作为示例: +----------+----------+ | 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| +----------+---

假设有一个日期框,其列由日期作为字符串组成。对于该假设,我们创建以下数据帧作为示例:

+----------+----------+
|    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|
+----------+----------+
#导入sql类型
从pyspark.sql.types导入StringType、IntegerType、StructType、StructField、DoubleType、FloatType、DateType
从pyspark.sql.functions导入日期\格式
随机输入
导入时间
def strTimeProp(开始、结束、格式、道具):
stime=time.mktime(time.strtime(start,format))#根据格式解析表示时间的字符串
etime=time.mktime(time.strtime(结束,格式))
ptime=时间+道具*(时间-时间)
return time.strftime(格式,time.localtime(ptime))
def随机日期(开始、结束、道具):
返回strTimeProp(开始,结束,'%m-%d-%Y',prop)
#prueba联合国数据框架公司:
schema=StructType(
[
StructField(“dates1”,StringType(),True),
StructField(“dates2”,StringType(),True)
]
)
尺寸=32
numCol1=[str(randomDate(“1-1-1991”,“1-1-1992”,random.random())表示范围内的数字(大小)]
numCol2=[str(randomDate(“1-1-1991”,“1-1-1992”,random.random())表示范围内的数字(大小)]
#构建数据帧:
sqlContext=sqlContext(sc)
df=sqlContext.createDataFrame(列表(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文档)更改日期格式:

#更改日期格式:
df.选择(日期格式('dates1','MM dd yyy')。别名('newFormat'))。显示(5)
但我得到了这个坏结果:

+---------+
|newFormat|
+---------+
|     null|
|     null|
|     null|
|     null|
|     null|
+---------+
我认为字符串数据类型有问题,但同时,我不明白为什么下面的代码有效,而上面的代码无效

fechas=['1000-01-01','1000-01-15']
df=sqlContext.createDataFrame(列表(zip(fechas,fechas)),['dates','d']
df.show()
#更改日期格式:
df.select(日期格式('dates','MM dd yyy')。别名('newFormat'))。show()
输出:

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

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

这最后的结果就是我想要的

它不起作用,因为您的数据不是有效的ISO 8601表示形式,并且强制转换到日期返回
NULL

sqlContext.sql("SELECT CAST('12-21-1991' AS DATE)").show()
## +----+
## | _c0|
## +----+
## |null|
## +----+
您必须首先使用自定义格式解析数据:

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

它应该是MM dd yyyy而不是MM dd yyyy吗?