pyspark系列--pyspark读写dataframe【看了觉得总结的很好,所以分享给大家,希望加大此文被搜索到的概率】

pyspark读写dataframe

  • 1. 连接spark
  • 2. 创建dataframe
    • 2.1. 从变量创建
    • 2.2. 从变量创建
    • 2.3. 读取json
    • 2.4. 读取csv
    • 2.5. 读取MySQL
    • 2.6. 从pandas.dataframe创建
    • 2.7. 从列式存储的parquet读取
    • 2.8. 从hive读取
  • 3. 保存数据
    • 3.1. 写到csv
    • 3.2. 保存到parquet
    • 3.3. 写到hive
    • 3.4. 写到hdfs
    • 3.5. 写到mysql

1. 连接spark

 
  1. from pyspark.sql import SparkSession

  2.  
  3. spark=SparkSession \

  4. .builder \

  5. .appName('my_first_app_name') \

  6. .getOrCreate()

2. 创建dataframe

2.1. 从变量创建

 
  1. # 生成以逗号分隔的数据

  2. stringCSVRDD = spark.sparkContext.parallelize([

  3. (123, "Katie", 19, "brown"),

  4. (234, "Michael", 22, "green"),

  5. (345, "Simone", 23, "blue")

  6. ])

  7. # 指定模式, StructField(name,dataType,nullable)

  8. # 其中:

  9. # name: 该字段的名字,

  10. # dataType:该字段的数据类型,

  11. # nullable: 指示该字段的值是否为空

  12. from pyspark.sql.types import StructType, StructField, LongType, StringType # 导入类型

  13.  
  14. schema = StructType([

  15. StructField("id", LongType(), True),

  16. StructField("name", StringType(), True),

  17. StructField("age", LongType(), True),

  18. StructField("eyeColor", StringType(), True)

  19. ])

  20.  
  21. # 对RDD应用该模式并且创建DataFrame

  22. swimmers = spark.createDataFrame(stringCSVRDD,schema)

  23.  
  24. # 利用DataFrame创建一个临时视图

  25. swimmers.registerTempTable("swimmers")

  26.  
  27. # 查看DataFrame的行数

  28. swimmers.count()

2.2. 从变量创建

 
  1. # 使用自动类型推断的方式创建dataframe

  2.  
  3. data = [(123, "Katie", 19, "brown"),

  4. (234, "Michael", 22, "green"),

  5. (345, "Simone", 23, "blue")]

  6. df = spark.createDataFrame(data, schema=['id', 'name', 'age', 'eyccolor'])

  7. df.show()

  8. df.count()

2.3. 读取json

 
  1. # 读取spark下面的示例数据

  2.  
  3. file = r"D:\hadoop_spark\spark-2.1.0-bin-hadoop2.7\examples\src\main\resources\people.json"

  4. df = spark.read.json(file)

  5. df.show()

2.4. 读取csv

 
  1. # 先创建csv文件

  2. import pandas as pd

  3. import numpy as np

  4. df=pd.DataFrame(np.random.rand(5,5),columns=['a','b','c','d','e']).\

  5. applymap(lambda x: int(x*10))

  6. file=r"D:\hadoop_spark\spark-2.1.0-bin-hadoop2.7\examples\src\main\resources\random.csv"

  7. df.to_csv(file,index=False)

  8.  
  9. # 再读取csv文件

  10. monthlySales = spark.read.csv(file, header=True, inferSchema=True)

  11. monthlySales.show()

2.5. 读取MySQL

 
  1. # 此时需要将mysql-jar驱动放到spark-2.2.0-bin-hadoop2.7\jars下面

  2. # 单机环境可行,集群环境不行

  3. # 重新执行

  4. df = spark.read.format('jdbc').options(

  5. url='jdbc:mysql://127.0.0.1',

  6. dbtable='mysql.db',

  7. user='root',

  8. password='123456'

  9. ).load()

  10. df.show()

  11.  
  12. # 也可以传入SQL语句

  13.  
  14. sql="(select * from mysql.db where db='wp230') t"

  15. df = spark.read.format('jdbc').options(

  16. url='jdbc:mysql://127.0.0.1',

  17. dbtable=sql,

  18. user='root',

  19. password='123456'

  20. ).load()

  21. df.show()

2.6. 从pandas.dataframe创建

 
  1. # 如果不指定schema则用pandas的列名

  2. df = pd.DataFrame(np.random.random((4,4)))

  3. spark_df = spark.createDataFrame (df,schema=['a','b','c','d'])

2.7. 从列式存储的parquet读取

 
  1. # 读取example下面的parquet文件

  2. file=r"D:\apps\spark-2.2.0-bin-hadoop2.7\examples\src\main\resources\users.parquet"

  3. df=spark.read.parquet(file)

  4. df.show()

2.8. 从hive读取

 
  1. # 如果已经配置spark连接hive的参数,可以直接读取hive数据

  2. spark = SparkSession \

  3. .builder \

  4. .enableHiveSupport() \

  5. .master("172.31.100.170:7077") \

  6. .appName("my_first_app_name") \

  7. .getOrCreate()

  8.  
  9. df=spark.sql("select * from hive_tb_name")

  10. df.show()

3. 保存数据

3.1. 写到csv

 
  1. # 创建dataframe

  2. import numpy as np

  3. df = pd.DataFrame(np.random.random((4, 4)),columns=['a', 'b', 'c', 'd'])

  4. spark_df = spark.createDataFrame(df)

  5.  
  6. # 写到csv

  7. file=r"D:\apps\spark-2.2.0-bin-hadoop2.7\examples\src\main\resources\test.csv"

  8. spark_df.write.csv(path=file, header=True, sep=",", mode='overwrite')

3.2. 保存到parquet

 
  1. # 创建dataframe

  2. import numpy as np

  3. df = pd.DataFrame(np.random.random((4, 4)),columns=['a', 'b', 'c', 'd'])

  4. spark_df = spark.createDataFrame(df)

  5.  
  6. # 写到parquet

  7. file=r"D:\apps\spark-2.2.0-bin-hadoop2.7\examples\src\main\resources\test.parquet"

  8. spark_df.write.parquet(path=file,mode='overwrite')

3.3. 写到hive

 
  1. # 打开动态分区

  2. spark.sql("set hive.exec.dynamic.partition.mode = nonstrict")

  3. spark.sql("set hive.exec.dynamic.partition=true")

  4.  
  5. # 使用普通的hive-sql写入分区表

  6. spark.sql("""

  7. insert overwrite table ai.da_aipurchase_dailysale_hive

  8. partition (saledate)

  9. select productid, propertyid, processcenterid, saleplatform, sku, poa, salecount, saledate

  10. from szy_aipurchase_tmp_szy_dailysale distribute by saledate

  11. """)

  12.  
  13. # 或者使用每次重建分区表的方式

  14. jdbcDF.write.mode("overwrite").partitionBy("saledate").insertInto("ai.da_aipurchase_dailysale_hive")

  15. jdbcDF.write.saveAsTable("ai.da_aipurchase_dailysale_hive", None, "append", partitionBy='saledate')

  16.  
  17. # 不写分区表,只是简单的导入到hive表

  18. jdbcDF.write.saveAsTable("ai.da_aipurchase_dailysale_for_ema_predict", None, "overwrite", None)

3.4. 写到hdfs

 
  1. # 数据写到hdfs,而且以csv格式保存

  2. jdbcDF.write.mode("overwrite").options(header="true").csv("/home/ai/da/da_aipurchase_dailysale_for_ema_predict.csv")

3.5. 写到mysql

 
  1. # 会自动对齐字段,也就是说,spark_df 的列不一定要全部包含MySQL的表的全部列才行

  2.  
  3. # overwrite 清空表再导入

  4. spark_df.write.mode("overwrite").format("jdbc").options(

  5. url='jdbc:mysql://127.0.0.1',

  6. user='root',

  7. password='123456',

  8. dbtable="test.test",

  9. batchsize="1000",

  10. ).save()

  11.  
  12. # append 追加方式

  13. spark_df.write.mode("append").format("jdbc").options(

  14. url='jdbc:mysql://127.0.0.1',

  15. user='root',

  16. password='123456',

  17. dbtable="test.test",

  18. batchsize="1000",

  19. ).save()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值