PySpark 2.4.0:RDD映射,包含文件随机错误的行

时间:2018-03-08 15:58:13

标签: python apache-spark pyspark apache-spark-sql rdd

我试图在DataFrame中加载一组我保存在文本格式文件中的向量,例如:

2.846110820770263672e+00 -1.368924856185913086e+00 6.769183874130249023e-01
2.846110820770263672e+00 -1.368924856185913086e+00 6.769183874130249023e-01

...

我使用Spark 2.4.0(从源码构建),我的代码类似于:

sc = SparkSession.builder.appName(appName).master("local[4]").getOrCreate()
data = sc.read.text(PATH_TO_VECTORS)
parsedData = data.rdd.map(lambda line: np.asarray([float(x) for x in line[0].split()]))

有时我在一些不在文件本身中的随机值上获得浮点解析错误。 例如,第一次错误可能是" ValueError:无法将字符串转换为浮点数:' 95e-01 \ x00 \ x001 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 .. "并且第二次可能是"无法将字符串转换为浮点数:' -1.436311483383178711e + 00 \ x005e-01'"等...

有人知道发生了什么吗?奇怪的是,每次运行我的代码时,我都有一个不同的值,浮点转换不起作用或它可以工作。

提前感谢!

1 个答案:

答案 0 :(得分:0)

错误是因为spark使用NF.exe作为默认编码。因此,一些文本被读作\ x00 \ x001 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00编码的字符串。您需要做的就是使用 utf-8编码告诉 spark 。你应该把它全部设定好。

我建议您使用unicode来阅读文本文件,因为可以选择定义编码。而且您甚至不必转换为sparkContext,因此数据将被读取为rdd。所以你可以做类似下面的事情

rdds

我希望答案很有帮助