《SparkSQL 2》--自定义创建DataFrame(StructType)、加载Json文件、parquet格式、CSV格式(以及解决乱码的问题)

本文介绍了如何使用SparkSQL自定义创建DataFrame,包括从JSON、Parquet和CSV格式的数据加载。特别讨论了加载数据时遇到的乱码问题,并提供了解决方案。示例中展示了Json数据的复杂结构,以及如何处理非UTF-8编码的CSV文件。
摘要由CSDN通过智能技术生成

加载外部数据源 users.txt: 
anne 22 NY 
joe 39 CO 
alison 35 NY 
mike 69 VA 
marie 27 OR
jim 21 OR
bob 71 CA
mary 53 NY
dave 36 VA
dude 50 CA
        

通过自定义方式创建DataFrame:

    1.从原来的RDD创建一个Row格式的RDD
    2.创建与RDD中Rows结构匹配的StructType,通过该StructType创建表示RDD的Schema
    3.通过SparkSession提供的createDataFrame方法创建DataFrame,方法参数为RDD的Schema
    案例说明:

import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
import org.apache.spark.sql.{Row, SparkSession}
    object sparkSqlTest {
      def main(args: Array[String]): Unit = {
        val sparksession = SparkSession.builder().appName("sparkSQL").master("local").getOrCreate()

        val rdd = sparksession.sparkContext.textFile("file:///d:/测试数据/users.txt")

        //----------官方文档案例----------
        //step1:从原来的RDD创建一个Row格式的RDD
        val rdd_row = rdd.map(x=>x.split(" ")).map(x=>Row(x(0),x(1),x(2)))
        //step2:官方文档
        val schemaString = "name age address"
    
        //Generate the schema based on the string of schema
        val fields = schemaString.split(" ")
           .map(fieldName => StructField(fieldName, StringType, nullable = true))
        val schema = StructType(fields)
    
    

        //----------字段非string匹配----------
        //step1:从原来的RDD创建一个Row格式的RDD
        val rdd_row = rdd.map(x=>x.split(" ")).map(x=>Row(x(0),x(1).toInt,x(2)))
        //step2:创建与RDD中Rows结构匹配的StructType(Int or String),通过该StructType创建表示RDD的Schema

        val fields = List(
          StructField("name", StringType, nullable = true),
          StructField("age", IntegerType, nullable = true),
          StructField("address", StringType, nullable = true)
        )
        
        val schema = StructType(fields)

        //val schema = StructType(Array(StructField(fields(0),StringType),StructField(fields(1),IntegerType)))

        //step3.通过SparkSession提供的createDataFrame方法创建DataFrame,方法参数为RDD的Schema
        val rdd_df = sparksession.createDataFrame(rdd_row,schema)

        //显示表中数据
        rdd_df.show

        // Creates a temporary view using the DataFrame rdd_df.createOrReplaceTempView("people")

        // SQL can be run over a temporary view created using DataFrames
        val results = sparksession.sql("SELECT name,age,address FROM people")

        // SQL查询的结果是DataFrames并支持所有正常的RDD操作
        // 结果中的行列可以通过字段索引或字段名称访问
        import sparksession.implicits._
        results.map({
          attributes => "datas: " + (attributes(0),attributes(1),
          attributes.getAs[String]("address"))
        }).show
      }
    }


------加载外部数据源:

    1.Json格式
       测试代码:数据说明,数据来自高德地图关于小学附近的Pois(数据),数据源为sample1.json

def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().appName("sparkSQL").master("local").getOrCreate()
    import spark.implicits._
    val df_json = spark.read.json("file:///d:/测试数据/sample1.json")
        
    //加载Json格式后&#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark SQL可以通过以下方式读取不同格式的数据: 1. MySQL:可以使用JDBC连接器读取MySQL数据库中的数据。 2. JSON:可以使用Spark SQL内置的JSON数据源读取JSON格式的数据。 3. Parquet:可以使用Spark SQL内置的Parquet数据源读取Parquet格式的数据。 4. CSV:可以使用Spark SQL内置的CSV数据源读取CSV格式的数据。 5. 普通文本:可以使用Spark SQL内置的文本数据源读取普通文本格式的数据。 以上这些数据源都可以通过Spark SQL的API进行读取和处理。 ### 回答2: Spark SQLSpark提供的用于处理结构化数据的模块,可以读取多种格式的数据,包括MySQLJSONParquetCSV以及普通文本。 对于MySQL数据的读取,Spark SQL可以通过JDBC连接到MySQL数据库,然后使用SQL语句查询并加载数据到DataFrame中进行进一步处理和分析。 对于JSON数据的读取,Spark SQL提供了read.json方法来加载JSON文件或目录,并将其解析为DataFrame,然后可以对其进行操作和分析。 对于Parquet数据的读取,Spark SQL也提供了read.parquet方法,通过指定Parquet文件或目录路径,可以加载并解析为DataFrame,然后进行进一步处理与分析。 对于CSV数据的读取,Spark SQL可以使用read.csv方法加载CSV文件或目录,并解析为DataFrame进行后续处理与分析。 对于普通文本数据的读取,Spark SQL可以使用read.text方法加载文本文件或目录,并将其按行解析为DataFrame,然后进行进一步处理与分析。 总结来说,Spark SQL提供了丰富的API方法来读取不同格式的数据,包括MySQLJSONParquetCSV以及普通文本,将其解析为DataFrame进行进一步处理和分析,提供了便捷高效的数据处理能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值