创建SparkSession:Spark 中所有功能的入口是 SparkSession 类。要创建一个基本的 SparkSession 对象, 只需要使用 SparkSession.builder():
import org.apache.spark.sql.SparkSession;
SparkSession spark = SparkSession
.builder()
.appName("Java Spark SQL basic example")
.config("spark.some.config.option", "some-value")
.getOrCreate();
// 加载csv文件,此时可能有中文乱码问题可以使用.config("encoding","gbk")指定字符集--gbk根据具体文件字符集指定
Dataset<Row> df = spark.read().csv("path/people.csv");
df.show();
//查询 name字段
df.select("name").show();
//给所有人年龄+1
df.select(col("name"), col("age").plus(1)).show();
//年龄大于18岁
df.filter(col("age").gt(18)).show();
//按年龄汇总数量
df.groupBy("age").count().show();
// 当需要指定自定义的类型时,也可以
Encoder<Person> personEncoder = Encoders.bean(Person.class);
Dataset<Person> peopleDS = spark.read().csv(path).as(personEncoder);
df.show();
//还可以注册临时视图
df.createGlobalTempView("people");
//然后
spark.sql("SELECT * FROM people").show();
//既然已经注册了 people,后续就可以向spark.sql()方法传入SQL语句完成对数据的分析,这样相对用代码开发更简单了
//若这个Person 不能被提前定义也可以用以下方法
JavaRDD<String> peopleRDD = spark.sparkContext()
.csv("examples/src/main/resources/people.csv", 1)
.toJavaRDD();
String schemaString = "name age";
List<StructField> fields = new ArrayList<>();
for (String fieldName : schemaString.split(" ")) {
StructField field = DataTypes.createStructField(fieldName, DataTypes.StringType, true);
fields.add(field);
}
StructType schema = DataTypes.createStructType(fields);
// Convert records of the RDD (people) to Rows
JavaRDD<Row> rowRDD = peopleRDD.map((Function<String, Row>) record -> {
String[] attributes = record.split(",");
return RowFactory.create(attributes[0], attributes[1].trim());
});
// Apply the schema to the RDD
Dataset<Row> peopleDataFrame = spark.createDataFrame(rowRDD, schema);
// 至此 ,peopleDataFrame 这个对象其实与上文中 peopleDS 对象一致了
有时候我们从CSV加载的数据列名不符合我们的规范要求,因此需要使用withColumnRenamed('old_column_name', 'new_column_name') 修改列名;
先到此了,上次面试公司提出的一个数据处理机试题与此类似,可惜当时没弄出来,惭愧
机试题大致如下:
根据提供的csv文件,加载数据进行如下处理
1.加载数据,去除空格和空值
2.对数据中的日期字段转换为标准格式
3.根据身份证号计算年龄,并筛选出18岁以下的数据;
4.根据性别分组统计数据量
5.对2、3、4的结果分别另存csv文件