我正在尝试从交通部读取飞行数据。它以CSV格式存储,并继续获取java.lang.NumberFormatException: null
我尝试将nanValue
设置为空字符串,因为它的默认值为NaN
,但这不起作用。
我目前的代码是:
spark = SparkSession.builder \
.master('local') \
.appName('Flight Delay') \
.getOrCreate()
schema = StructType([
StructField('Year', IntegerType(), nullable=True),
StructField('Month', IntegerType(), nullable=True),
StructField('Day', IntegerType(), nullable=True),
StructField('Dow', IntegerType(), nullable=True),
StructField('CarrierId', StringType(), nullable=True),
StructField('Carrier', StringType(), nullable=True),
StructField('TailNum', StringType(), nullable=True),
StructField('Origin', StringType(), nullable=True),
StructField('Dest', StringType(), nullable=True),
StructField('CRSDepTime', IntegerType(), nullable=True),
StructField('DepTime', IntegerType(), nullable=True),
StructField('DepDelay', DoubleType(), nullable=True),
StructField('TaxiOut', DoubleType(), nullable=True),
StructField('TaxiIn', DoubleType(), nullable=True),
StructField('CRSArrTime', IntegerType(), nullable=True),
StructField('ArrTime', IntegerType(), nullable=True),
StructField('ArrDelay', DoubleType(), nullable=True),
StructField('Cancelled', DoubleType(), nullable=True),
StructField('CancellationCode', StringType(), nullable=True),
StructField('Diverted', DoubleType(), nullable=True),
StructField('CRSElapsedTime', DoubleType(), nullable=True),
StructField('ActualElapsedTime', DoubleType(), nullable=True),
StructField('AirTime', DoubleType(), nullable=True),
StructField('Distance', DoubleType(), nullable=True),
StructField('CarrierDelay', DoubleType(), nullable=True),
StructField('WeatherDelay', DoubleType(), nullable=True),
StructField('NASDelay', DoubleType(), nullable=True),
StructField('SecurityDelay', DoubleType(), nullable=True),
StructField('LateAircraftDelay', DoubleType(), nullable=True)
])
flts = spark.read \
.format('com.databricks.spark.csv') \
.csv('/home/william/Projects/flight-delay/data/201601.csv',
schema=schema, nanValue='', header='true')
以下是我正在使用的CSV:http://pastebin.com/waahrgqB
最后一行有中断并提升java.lang.NumberFormatException: null
似乎有些数字列是空字符串,而其他数据列只是空字符串。有人可以帮帮我吗?
答案 0 :(得分:1)
感谢KiranM的建议,我找到了解决方案。我让Spark推断出架构(一切都设置为String),然后手动设置我想要的数字列。
以下是代码:
from pyspark.sql import (SQLContext,
SparkSession)
from pyspark.sql.types import (StructType,
StructField,
DoubleType,
IntegerType,
StringType)
spark = SparkSession.builder \
.master('local') \
.appName('Flight Delay') \
.getOrCreate()
flts = spark.read \
.format('com.databricks.spark.csv') \
.csv('/home/william/Projects/flight-delay/data/merged/2016.csv',
inferSchema='true', nanValue="", header='true', mode='PERMISSIVE')
flts = flts \
.withColumn('Year', flts['Year'].cast('int')) \
.withColumn('Month', flts['Month'].cast('int')) \
.withColumn('Day', flts['Day'].cast('int')) \
.withColumn('Dow', flts['Dow'].cast('int')) \
.withColumn('CRSDepTime', flts['CRSDepTime'].cast('int')) \
.withColumn('DepTime', flts['DepTime'].cast('int')) \
.withColumn('DepDelay', flts['DepDelay'].cast('int')) \
.withColumn('TaxiOut', flts['TaxiOut'].cast('int')) \
.withColumn('TaxiIn', flts['TaxiIn'].cast('int')) \
.withColumn('CRSArrTime', flts['CRSArrTime'].cast('int')) \
.withColumn('ArrTime', flts['ArrTime'].cast('int')) \
.withColumn('ArrDelay', flts['ArrDelay'].cast('int')) \
.withColumn('Cancelled', flts['Cancelled'].cast('int')) \
.withColumn('Diverted', flts['Diverted'].cast('int')) \
.withColumn('CRSElapsedTime', flts['CRSElapsedTime'].cast('int')) \
.withColumn('ActualElapsedTime', flts['ActualElapsedTime'].cast('int')) \
.withColumn('AirTime', flts['AirTime'].cast('int')) \
.withColumn('Distance', flts['Distance'].cast('int')) \
.withColumn('CarrierDelay', flts['CarrierDelay'].cast('int')) \
.withColumn('WeatherDelay', flts['WeatherDelay'].cast('int')) \
.withColumn('NASDelay', flts['NASDelay'].cast('int')) \
.withColumn('SecurityDelay', flts['SecurityDelay'].cast('int')) \
.withColumn('LateAircraftDelay ', flts['LateAircraftDelay '].cast('int'))
也许我可以把它放到一个循环中,但我现在要用它来运行。
答案 1 :(得分:0)
问题在于数字类型列具有空字符串(使用“”而不是空白数据)。
然后一个选项是将数据读取为StringType列,然后将该列类型转换为相关类型(例如:int)。这样它就不会影响其他列数据。
StructField('CRSDepTime', StringType(), nullable=True),
flts.withColumn('CRSDepTime', flts['CRSDepTime'].cast("int")) \
.printSchema()
这可以解决您的问题。