当前位置: 首页 > 面试题库 >

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

夏侯英纵
2023-03-14
问题内容

假设有一个日期框架,其中的一列包含日期作为字符串。为此,我们创建以下dataFrame作为示例:

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

这是我想要的最后结果。


问题答案:

它不起作用,因为您的数据不是有效的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
))


 类似资料:
  • 问题内容: 我无法获取Alamofire请求的结果。因此,我创建了从json异步调用获取的数组的输出。我无法从dispatch {…}中获取resultArray。当我添加println来调试代码。第二个出现在第一个之前。我只想要resultArray从Alamofire获取数据以显示在UIPickerView中。请帮助!!! 这是我的代码 这是我在控制台上的输出 请我真的需要知道我正在发生什么以

  • 问题内容: 我正在尝试在片段中使用RecyclerView。对于第一个选项卡,它显示得很好,但是当我滑动到第二个选项卡然后又回到第一个选项卡时,出现以下错误: java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ void android.support.v7.widget.RecyclerView $ LayoutManager.stopSmoothSc

  • 我正在尝试为我的Android应用程序创建一个推送服务,我遵循Google GCM的文档和示例: 我可以注册/注销我的Android应用程序。从我的服务器端,我可以看到我注册了一个订阅,但当我尝试从服务器向我的Android应用程序发送消息时,我总是收到以下错误: 发送消息到设备#0时出错:MismatchSenderId 对于我的Android应用程序,我使用SENDER_ID=20000000

  • 我试图在Java做简单的聊天应用程序,但我得到这个错误。怎么了?我该怎么修好它?for循环中有一些错误? 我得到这个错误 线程“main”java.lang.IndexOutoFboundsException:索引0超出长度0的界限,位于java.base/jdk.internal.util.preconditions.OutoFbounds(preconditions.java:64)位于jav

  • 我收到的错误: 这是我的代码 我尝试了几种不同的方法来读取此文件,但我无法弄清楚为什么会发生这种情况。我使用的扩展名.rtf,.txt,认为这可能是文件本身的问题。该文件仅包含以下内容:

  • 嗨, 我正在一个项目工作,我需要从Instagram实时更新的某些标签。 这是我创建订阅的代码 输出为: 这是callback.php的代码: activity.log中的一行是: [{“changed_aspect”:“media”,“object”:“tag”,“object_id”:“winter”,“time”:1385411793,“subscription_id”:3932963,“d