CSV数据导出/复制到HDFS将在怪异格式

问题描述:

我使用的是火花的工作,使用下面的代码行从声明区读取csv文件数据以及应对这些数据到HDFS:CSV数据导出/复制到HDFS将在怪异格式

val conf = new SparkConf().setAppName("WCRemoteReadHDFSWrite").set("spark.hadoop.validateOutputSpecs", "true"); 

val sc = new SparkContext(conf) 
val rdd = sc.textFile(source) 

rdd.saveAsTextFile(destination) 

CSV文件在下面的格式具有数据:

CTID,C3UID,区域,产品,关键字

1,1004634181441040000,东,移动,NA

2,1004634181441040000,西,平板,NA

而当数据进入HDFS不言而喻在以下格式:

CTID,C3UID,区域,产品,关键字

1,1.00463 E + 18,东,移动,NA

2,1.00463E + 18,西,平板电脑,NA

我无法找到背后的任何有效理由。 任何形式的帮助,将不胜感激。

问候, 布佩希

什么情况是,因为你的C3UID是大量的,它就会被解析为双然后保存在标准双人符号。您需要修复架构,并确保您以Long,BigDecimal或String的形式读取第二列,然后在字符串表示中不会有任何更改。

+0

感谢您的回复@瑞克莫里茨当你说我应该修复我的模式,这是否意味着我应该使用Spark Dataframe API从共享位置读取数据并将数据写入HDFS? –

+0

@ChauhanB:不一定 - 但它可能有帮助。一个好的起点是检查RDD中的类型 - Double的检测可能已经发生在sc.textFile中,或者在保存步骤中。如果你真的想复制数据,也可以考虑使用HDFS-API,而不是Spark里面的/。如果你想在后续处理中重新使用数据,使用Spark是一个更好的选择 - 对于这种类型的数据,DataFrame API更合适,所以我会推荐。 –

+0

我想去Spark API,因为我希望在将数据保存到HDFS之前在行数据顶部执行某种数据清理和数据清理。我也探索过其他工具,比如Apache Nifi,但是我想避免为Apache Nifi增加额外的集群成本。我想在我的主应用程序在HDFS中加载数据之后运行我的现有spark和HDFS集群。你认为这是一个好方法吗?在将数据保存到HDFS之前,您是否觉得使用Spark进行数据加载是一个好主意[我将在其间进行数据清理]? –

有时您的CSV文件也可能是罪魁祸首。不要在Excel中打开CSV文件,因为Excel可能会将这些大数值转换为指数格式,因此一旦使用Spark任务将数据导入hdfs,它将以字符串格式显示。

因此,在使用spark工具导入到hdfs之前,请确保您的CSV数据不应该在excel中打开。如果你真的想看到你的Excel的内容使用记事本++或任何其他文本编辑器工具