将carbondata数据保存为csv文件,可以通过以下方式操作
/**
* 将查询结果Dataset保存为csv文件
* @param sql 查询语句
* @param path csv存放路径(相对HDFS的路径,例如:/opt/csvFile)
* @param delimiter csv文件分隔符,默认为逗号 delimiter = ",";
* @return
*/
public static boolean exportDatasetAsCSV(String sql, String path, String delimiter) {
if (StringUtils.isBlank(delimiter)) {
delimiter = ",";
}
if (StringUtils.isNotBlank(path) && StringUtils.isNotBlank(sql)) {
getSparkSession().sql(sql)
.coalesce(1)
.write()
.option("header", "true") //是否包含csv头
.option("sep ", delimiter) //分隔符,默认为 ,
.mode(SaveMode.Overwrite)
.csv(path);
return true;
}
return false;
}
但是,会报异常:
java.lang.NoSuchMethodError: com.univocity.parsers.csv.CsvParserSettings.
setUnescapedQuoteEnable
异常原因:
Carbondata自带Univocity-parsers版本为1.5.6,而Spark的univocity-parser版本为2.2.1,二者冲突,并且carbondata的jar包放在了spark_classpath下,这就导致在spark调用csv转换的相关方法时,使用的是carbondata内部的univocity-parser,有些方法在1.5.6中不存在,所以报异常NoSuchMethod。
解决方案:
方法一、将carbondata源码打开,修改Maven依赖,将com.univocity版本锁定为2.2.1,并去除1.5.6的冲突依赖;重新编译替换原来的carbondata即可;
方法二、将com.univocity的2.2.1版本jar包放入spark_classpath中(这个方法不一定好用)