我通过从HDFS加载一个csv文件创建了一个数据框。该文件中的某些列为空(说名称(字符串),ID(整数),等级(双精度))。
一旦我加载数据而没有定义架构(StructField和StructType),所有记录都将出现并且空列值将出现。但是当我做一个过滤器时,空值被跳过了。
一旦我通过定义自定义架构加载数据,如果任何列值都为null,那么整个行将显示为null。
所以我无法以任何一种方式处理数据。我希望所有数据都被加载。我尝试了IS NULL,NA replace和all,但没有任何效果。
任何解决方案表示赞赏
Sample data loaded in HDFS : test_data.csv
Name,ID,Average
"Yahoo",100,10.5
"Google",,10.5
"Apple",100,
"Samsung",,
Code Snippet
file_path='/user/abc/test_data.csv'
from pyspark.sql.types import (StructField, StructType, StringType, IntegerType, DoubleType)
data_schema = [StructField('Name', StringType(), True),
StructField('ID', IntegerType(), True),
StructField('Average', DoubleType(), True)
]
final_struct = StructType(fields=data_schema)
df_data_csv = spark.read.format('csv').options(header='true',inferschema='true',schema=final_struct).load(file_path)
df_data_csv.printSchema()
|-- Name: string (nullable = true)
|-- ID: string (nullable = true)
|-- Average: string (nullable = true)
问题1 :代替int和double,所有字段均作为StringType加载 如果我使用的是“ spark.read.format”方法。但是,如果正在使用“ spark.read.csv”模式,则可以正确使用
问题2 :如果我使用定义了架构的方法“ spark.read.csv”
df_data_csv.show()将所有属性都设置为null(如果任何列值为null)
如果我不使用上面定义的架构而继续使用方法“ spark.read.csv”
当我在计算中使用数字字段时,它会忽略至少1列值为null的记录