Python PySpark-如何删除csv输出中的科学符号
我有一个spark聚合,我想将结果输出到csv,但我发现spark总是输出大量的科学符号小数。我尝试了中提到的解决方案,但也没有成功 预期产出:Python PySpark-如何删除csv输出中的科学符号,python,apache-spark,pyspark,scientific-notation,Python,Apache Spark,Pyspark,Scientific Notation,我有一个spark聚合,我想将结果输出到csv,但我发现spark总是输出大量的科学符号小数。我尝试了中提到的解决方案,但也没有成功 预期产出: foo,avg(bar) a,0.0000002 b,0.0000001 实际产量: foo,avg(bar) a,2.0E-7 b,1.0E-7 请参见下面的示例: 从操作系统导入路径 进口舒蒂尔 导入glob 从pyspark.sql导入SQLContext,函数为F,类型为 def测试(sc): sq=SQLContext(sc) 数据=[(
foo,avg(bar)
a,0.0000002
b,0.0000001
实际产量:
foo,avg(bar)
a,2.0E-7
b,1.0E-7
请参见下面的示例:
从操作系统导入路径
进口舒蒂尔
导入glob
从pyspark.sql导入SQLContext,函数为F,类型为
def测试(sc):
sq=SQLContext(sc)
数据=[(“a”,1e-7),(“b”,1e-7),(“a”,3e-7)]
df=sq.createDataFrame(数据,['foo','bar'])
#12位小数点后9位
decType=类型。DecimalType(精度=12,刻度=9)
#将列输入和列输出强制转换为十进制
累计=[F.平均值(F.col(“bar”).cast(decType)).cast(decType)]
组=[F.col(“foo”)]
结果=df.groupBy(*groups).agg(*aggs)
写入(结果)
返回df、AGG、组、结果
def写入(结果):
tmpDir=path.join(“res”,“tmp”)
配置={“sep”:“,”}
result.write.format(“csv”)\
.options(**配置)\
.save(tmpDir)
#完成分发部分后,将其写入单个文件
allFiles=glob.glob(path.join(tmpDir,*.csv)))
fullOut=path.join(“res”,“final.csv”)
将open(fullOut,'wb')作为wfd:
#首先写出标题行
header=config.get(“sep”、“、”).join(result.columns)
wfd.write(标题+“\n”)
对于所有文件中的f:
打开(f,'rb')作为fd:
shutil.copyfileobj(fd,wfd)
通过
通过
shutil.rmtree(tmpDir)
返回
在pyspark外壳中:
将火花_测试导入为t
t、 测试(sc)
是否尝试将聚合结果强制转换为字符串
?这样,excel就不会将该值识别为十进制,因此不会给出科学的符号表示法。请将当前输出和预期输出相加。我没有。您介意提供一个工作示例吗?有没有一种方法可以使用format_string删除尾随的零?当我将数据帧写到csv@thentangler我还没试过,但我们再把它们扔到绳子上怎么样?行了!非常感谢。
>>> df1 = spark.createDataFrame([('a','2.0e-7'),('b','1e-5'),('c','1.0e-7')],['foo','avg'])
>>> df1.show()
+---+------+
|foo| avg|
+---+------+
| a|2.0e-7|
| b| 1e-5|
| c|1.0e-7|
+---+------+
>>> df1.select('foo','avg',format_string('%.7f',df1.avg.cast('float')).alias('converted')).show()
+---+------+---------+
|foo| avg|converted|
+---+------+---------+
| a|2.0e-7|0.0000002|
| b| 1e-5|0.0000100|
| c|1.0e-7|0.0000001|
+---+------+---------+