接下来介绍几种使用spark将DataFrame中一行的多列合并到一列中,并且该列以不同的类型展示保存
1、建立dataset
//自己需要连接的mongo库
private static String datasource = "";
//自己需要连接的mongo库的集合
private static String targetTable = "";
SparkSession sparkSession = SparkSession.builder()
.appName("hive-mongo")
.master("local[*]")
.enableHiveSupport()
.config("spark.sql.hive.convertMetastoreOrc", false)
.config("spark.sql.legacy.hive.tmpTable", true)
.config("convertMetastoreParquet", false)
.config("spark.sql.debug.maxToStringFields", 1000)
.config("spark.mongodb.output.uri", datasource)
.config("spark.mongodb.output.collection", targetTable)
.getOrCreate();
String sql = "select *from user ";
Dataset<Row> dataset = sparkSession.sql(sql);
2、将已有的列多列合并为一列,并删除之前的列
//将已有的列(cloumn)多列合并为一个列;并删除之前的列
Dataset<Row>getDataset = dataset.withColumn("newFLag",concat_ws(String.valueOf(','),
dataset.col("name"),dataset.col("sex"))).drop("name","sex");
3、将已有的列多列合并为一列,并用特定字符连接
//将已有的列(cloumn)多列合并为一个列.并用“_”拼接
Dataset<Row>upselect = dataset.withColumn("newFLag",concat_ws(String.valueOf('_'),
dataset.col("name"),dataset.col("sex")));
4、将已有的列多列合并为一列,用数组表示
//将已有的列(column)多列合并为一个列,用数组表示
Dataset<Row>getUpselect = dataset.withColumn("newFlags", split(col("newFlag"), ",")).drop("newFlag");
5、将已有的列多列合并为一列,并计算合并的值
//将已存在的列合并为一个列,并计算合并的值
Dataset<Row>getSelectNum = dataset.withColumn("newFlagNum", dataset.col("A").plus("B").cast(DataTypes.IntegerType));
6、获取已存在的某一列的值的长度,并将获取的长度新增一列
//获取已存在的某一列的值的长度,并将获取的长度新增一列
UDF1 lengt = new UDF1<String, Integer>() {
@Override
public Integer call(String s) throws Exception {
return s.getBytes().length;
}
};
//
Dataset<Row> getselectLength;
{
try {
getselectLength = dataset.withColumn("bytesLength", (Column) lengt.call(dataset.col("newFlags")));
} catch (Exception e) {
e.printStackTrace();
}
}