数据读取与格式转换
读取JSON数据:使用Spark提供的读取接口(如 spark.read.json() ,在不同编程语言接口下使用方式类似)将给定的JSON格式数据读入Spark中,形成 DataFrame 。
import org.apache.spark.sql.SparkSession
object JsonDataProcessing {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder()
.appName("JsonDataRead")
.master("local[*]")
.getOrCreate()
// 读取JSON数据,形成DataFrame
val df = spark.read.json("path/to/your/json/file.json")
df.show()
}
}
格式转换:按照题目要求,利用 get_json_object 函数(如果是在SQL语句中操作,在不同语言中使用该函数的语法略有差异)对JSON格式数据进行格式转换,以便后续分析处理。
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.get_json_object
object JsonDataFormatConversion {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder()
.appName("JsonDataFormatConversion")
.master("local[*]")
.getOrCreate()
val df = spark.read.json("path/to/your/json/file.json")
// 利用get_json_object函数进行格式转换
val convertedDf = df.select(
get_json_object($"data", "$.uid").as("uid"),
get_json_object($"data", "$.phone").as("phone"),
get_json_object($"data", "$.addr").as("addr")
)
convertedDf.show()
}
}
统计有效数据条数
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.get_json_object
object ValidDataCount {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder()
.appName("ValidDataCount")
.master("local[*]")
.getOrCreate()
val df = spark.read.json("path/to/your/json/file.json")
val convertedDf = df.select(
get_json_object($"data", "$.uid").as("uid"),
get_json_object($"data", "$.phone").as("phone"),
get_json_object($"data", "$.addr").as("addr")
)
// 筛选有效数据(uid、phone、addr三个字段均无空值)
val validDf = convertedDf.filter($"uid" =!= "" && $"phone" =!= "" && $"addr" =!= "")
// 统计有效数据记录条数
val count = validDf.count()
println(s"有效数据记录条数为: $count")
}
}
筛选有效数据:依据有效数据的定义( uid 、 phone 、 addr 三个字段均无空值 ),使用过滤条件(如 filter 函数 )筛选出满足条件的数据行。
筛选有效数据并统计条数
根据有效数据的定义(uid、phone、addr三个字段均无空值),使用filter函数筛选出满足条件的数据行,并统计记录条数。
# 筛选有效数据
valid_df = df.filter(df["uid"].isNotNull() & df["phone"].isNotNull() & df["addr"].isNotNull())
# 统计有效数据条数
valid_count = valid_df.count()
print(f"有效数据条数: {valid_count}")
统计用户数量最多的前二十个地址
以addr字段为分组依据,使用groupBy函数对有效数据进行分组,然后统计每个地址对应的用户数量(即记录数)。根据统计出的用户数量,使用orderBy函数按降序排列地址,并使用limit函数选取用户数量最多的前二十个地址。
# 分组聚合统计每个地址的用户数量
address_counts = valid_df.groupBy("addr").count()
# 排序并选取前二十个地址
top_20_addresses = address_counts.orderBy(address_counts["count"].desc()).limit(20)
# 显示结果
top_20_addresses.show()
分组聚合:以 addr 字段为分组依据,使用 groupBy 函数对有效数据进行分组,然后通过 count 函数统计每个地址对应的用户数量(即记录数)。
排序与筛选:根据统计出的用户数量,使用排序函数(如 orderBy ,并按降序排列)对地址进行排序,最后使用 limit 函数选取用户数量最多的前二十个地址 。