【Python笔记】spark.read.csv

本文探讨了Spark读取csv、json、MySQL和Hive数据的多种方式,以及`spark.read.csv`与`spark.read.format`性能对比,重点讲解了数据加载的最佳实践和常见技术路径。
部署运行你感兴趣的模型镜像

1 问题发现

from pyspark.sql.types import StructField, StructType, StringType

# 定义 spark df 的表结构
schema = StructType(
    [
        StructField('ip', StringType(), True),
        StructField('city', StringType(), True)
    ]
)
ip_city_path = job+'/abcdefg'
ip_city_df = spark.read.csv(ip_city_path, header=True, schema=schema, encoding='utf-8', sep=',')

or

spark.read
     .option("charset", "utf-8")
     .option("header", "true")
     .option("quote", "\"")
     .option("delimiter", ",")
     .csv(...)

2 Spark读取外部数据的几种方式

Spark读取外部数据的几种方式

2.1 读取csv文件(四种方式)

//方式一:直接使用csv方法
  val sales4: DataFrame = spark.read.option("header", "true").option("header", false).csv("file:///D:\\Software\\idea_space\\spark_streaming\\src\\data\\exam\\sales.csv")
    .withColumnRenamed("_c0", "time")
    .withColumnRenamed("_c1", "id")
    .withColumnRenamed("_c2", "salary")
    .withColumn("salary", $"salary".cast("Double"))

//方式二:使用format
  val salesDF3 = spark.read.format("com.databricks.spark.csv")
  //header默认false头不设置成字段名,true是第一行作为数据表的字段名
    // .option("header", "true")
    //自动类型推断
	// .option("inferSchema", true)
    .load("D:\\Software\\idea_space\\spark_streaming\\src\\data\\exam\\sales.csv")
    //字段重命名
    .withColumnRenamed("_c0", "time")
    .withColumnRenamed("_c1", "id")
    .withColumnRenamed("_c2", "salary")
    //字段重命名后修改类型
    .withColumn("salary", $"salary".cast("Double"))
    
 //方式三:通过算子将数组转换成样例类对象
private val salesDF: DataFrame = sc.textFile("file:///D:\\Software\\idea_space\\spark_streaming\\src\\data\\exam\\sales.csv")
    .map(_.split(",")).map(x => Sales(x(0), x(1), x(2).toDouble)).toDF()
case class Sales(time:String,id:String,salary:Double)    

 //方式四:通过schema创建 
 val userRDD:RDD[Row] = sc.textFile("file:///D:\\Software\\idea_space\\spark_streaming\\src\\data\\exam\\demo02.txt").map(_.split(","))
      .map(x => Row(x(0), x(1), x(2).toInt))
 
 val schema = StructType(Array(
  StructField("username", StringType, true),
  StructField("month", StringType, true),
  StructField("visitNum", IntegerType, true)
 ))
 
 val userDF: DataFrame = spark.createDataFrame(userRDD,schema)

spark.read.format(“csv”)与spark.read.csv的性能差异

DF1花了42秒,而DF2只花了10秒. csv文件的大小为60+ GB.

DF1 = spark.read.format("csv").option("header", "true").option("inferSchema", "true").load("hdfs://bda-ns/user/project/xxx.csv")

DF2 = spark.read.option("header", "true").csv("hdfs://bda-ns/user/project/xxx.csv")

https://www.it1352.com/1847378.html

2.2 读取json文件

//方式一:
private val userJsonDF: DataFrame = spark.read.json("file:///D:\\Software\\idea_space\\spark_streaming\\src\\data\\exam\\users.json")
//方式二:
private val userJsonDF: DataFrame = spark.read.format("json").load("D:\\Software\\idea_space\\spark_streaming\\src\\data\\exam\\users.json")

2.3 读取及写入mysql

读取

val url = "jdbc:mysql://hadoop1:3306/test"
  val tableName = "sales"
  private val prop = new Properties()
  prop.setProperty("user","root")
  prop.setProperty("password","ok")
  prop.setProperty("driver","com.mysql.jdbc.Driver")
  
private val salesDF2: DataFrame = spark.read.jdbc(url,tableName,prop)

写入

val url = "jdbc:mysql://hadoop1:3306/test"
  val tableName = "sales"
  private val prop = new Properties()
  prop.setProperty("user","root")
  prop.setProperty("password","ok")
  prop.setProperty("driver","com.mysql.jdbc.Driver")
  //mode的几种方式:overwrite覆盖,append追加
salesDF.write.mode("overwrite").jdbc(url,tableName,prop)

2.4 操作hive中的数据表

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

任务描述 我们这里有一部分学生在 2019 年 7 月 1 日 - 2019 年 11 月 30 日的消费数据,接下来我们需要对其进行分析,从而得出我们想要的数据。 本关任务:统计每个月男女生使用各种支付方式的次数以及该月该方式的总次数。 使用 Spark 结合学生个人信息、学生消费数据来统计每个月男女生使用各种支付方式的次数以及该月该方式的总次数,最后结果按年份和总次数升序排序; 将查询结果存放 MySQL 数据库 mydb 的 pay_number 表中。 查询结果样例如下: date pay malesnumber femalesnumber num 2019-07 信用卡 142 137 279 2019-07 其它 287 252 539 2019-07 银行卡 402 376 778 2019-07 现金 656 681 1337 2019-07 微信 1923 2037 3960 2019-07 支付宝 3279 3498 6777 数据说明 学生个人信息: 文件所在位置:/data/workspace/myshixun/files/info.csv; 文件部分数据展示如下: id,name,birth,sex,address,idcard,phone,email 514,任秀珍,2000-05-13,女,新疆维吾尔自治区巢湖县永川惠州路q座 286547,52**************64,187****1357,juanye@15.cn 516,何建,2000-01-06,男,天津市金凤市怀柔王街y座 815599,61**************99,150****6795,span@20.cn 字段说明: 字段名 说明 id 学号 name 姓名 birth 出生日期 address 地址 idcard 身份证号 phone 手机号 email 邮箱 学生消费信息: 文件所在位置:/data/workspace/myshixun/files/consume.csv; 文件部分数据展示如下(使用 $ 分隔): id$consume$price$category$date$pay 8080$无印良品 MUJI 长条诗笺型笔记表格,白色 40枚 14行$10.0$无印良品 MUJI 系列$2019-09-17 15:10:44$其它 3800$小米CC9 3200万美颜自拍 索尼4800万超清三摄 多功能NFC,4030mAh 深蓝星球 6GB+64GB 游戏智能拍照手机$1799.0$小米手机$2019-08-19 18:28:26$支付宝 字段说明如下: 字段名 说明 id 学号 consume 消费内容 price 消费金额 category 消费的商品类别 date 消费时间 pay 支付方式 MySQL 数据库 mydb: 用户名:root; 密码:123123。 pay_number 表结构: 字段名 含义 数据存储类型 pay 支付方式 varchar(255) month 月份(格式:2019-10) varchar(255) malesnumber 男生使用次数 bigint femalesnumber 女生使用次数 bigint num 该月总次数 bigint 测试说明 本关考察的是同学们的 Spark 实践操作,在右侧编辑器中编写代码,平台对你的代码进行测试,如果查询结果与预期输出一致,则算通关。 开始你的任务吧,祝你成功! import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.apache.spark.sql.SaveMode; import org.apache.spark.sql.SparkSession; import org.apache.spark.sql.api.java.UDF1; import org.apache.spark.sql.types.DataTypes; public class PayNumber { public static void main(String[] args) { /********** Begin **********/ SparkSession spark = SparkSession.builder().master("local").appName("PayNumber").getOrCreate(); spark.stop(); /********** End **********/ } }
最新发布
10-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值