通过pyspark读取csv文件,空白列中有一些值
Reading csv file through pyspark with some values in column blank
我有一个 csv 文件,看起来像这样
A B C
1 2
2 4
3 2 5
1 2 3
4 5 6
当我将此数据读入 spark 时,由于前几行中的 "blanks",它会将 C 列视为 "string"。
谁能告诉我如何在 SQL 数据框中加载此文件,以便 c 列保持整数(或浮点数)?
我正在使用“sc.textFile
”将数据读入 spark,然后将其转换为 SQL 数据帧。
我阅读了 this and this 个链接。但是他们对我帮助不大。
我的代码部分。在代码的最后一行我收到了错误。
myFile=sc.textFile(myData.csv)
header = myFile.first()
fields = [StructField(field_name, StringType(), True) for field_name in header.split(',')]
fields[0].dataType = FloatType()
fields[1].dataType = FloatType()
fields[2].dataType = FloatType()
schema = StructType(fields)
myFileCh = myFile.map(lambda k: k.split(",")).map(lambda p: (float(p[0]),float(p[1]),float(p[2])))
谢谢!
所以问题在于这种不安全的转换。您可以实现一个短函数,该函数将执行 "safe" 强制转换和 return 一个默认值,以防强制转换为 fload 失败。
def safe_cast(val, to_type, default=None):
try:
return to_type(val)
except ValueError:
return default
safe_cast('tst', float) # will return None
safe_cast('tst', float, 0.0) # will return 0.0
myFileCh = myFile.map(lambda k: k.split(",")).map(lambda p: (safe_cast(p[0], float),safe_cast(p[1], float),safe_cast(p[2], float)))
我有一个 csv 文件,看起来像这样
A B C
1 2
2 4
3 2 5
1 2 3
4 5 6
当我将此数据读入 spark 时,由于前几行中的 "blanks",它会将 C 列视为 "string"。
谁能告诉我如何在 SQL 数据框中加载此文件,以便 c 列保持整数(或浮点数)?
我正在使用“sc.textFile
”将数据读入 spark,然后将其转换为 SQL 数据帧。
我阅读了 this and this 个链接。但是他们对我帮助不大。
我的代码部分。在代码的最后一行我收到了错误。
myFile=sc.textFile(myData.csv)
header = myFile.first()
fields = [StructField(field_name, StringType(), True) for field_name in header.split(',')]
fields[0].dataType = FloatType()
fields[1].dataType = FloatType()
fields[2].dataType = FloatType()
schema = StructType(fields)
myFileCh = myFile.map(lambda k: k.split(",")).map(lambda p: (float(p[0]),float(p[1]),float(p[2])))
谢谢!
所以问题在于这种不安全的转换。您可以实现一个短函数,该函数将执行 "safe" 强制转换和 return 一个默认值,以防强制转换为 fload 失败。
def safe_cast(val, to_type, default=None):
try:
return to_type(val)
except ValueError:
return default
safe_cast('tst', float) # will return None
safe_cast('tst', float, 0.0) # will return 0.0
myFileCh = myFile.map(lambda k: k.split(",")).map(lambda p: (safe_cast(p[0], float),safe_cast(p[1], float),safe_cast(p[2], float)))