SparkSQL 概述

ase on spark 1.5.1 overview

一、入口:

[java]  view plain  copy
  1. val sc: SparkContext // An existing SparkContext.  
  2. val sqlContext = new org.apache.spark.sql.SQLContext(sc)  
  3.   
  4. // this is used to implicitly convert an RDD to a DataFrame.  
  5. import sqlContext.implicits._  

SQLContext默认解析器为"sql",用于解析sql语句。

除了SQLContext之外,还有HiveContext,用了更加完善的解析器,默认解析器为spark.sql.dialect="hiveql"

二、创建DataFrames

目前支持从RDD、hive表以及其它数据源中创建DataFrames。详见下一篇介绍

[java]  view plain  copy
  1. val sc: SparkContext // An existing SparkContext.  
  2. val sqlContext = new org.apache.spark.sql.SQLContext(sc)  
  3.   
  4. val df = sqlContext.read.json("examples/src/main/resources/people.json")  
  5.   
  6. // Displays the content of the DataFrame to stdout  
  7. df.show()  
三、DataFrames对外DSL接口

1、show:打印

2、printSchema:打印schema信息

3、select: 从原始DataFrames中选择部分colums

4、filter:过滤

5、groupBy:分组

6、count:计数

...

详见下一篇介绍

四、运行sql

[java]  view plain  copy
  1. val sqlContext = ...  // An existing SQLContext  
  2. val df = sqlContext.sql("SELECT * FROM table")  
五、Schema推断

1、从已知格式中反射出对应的schema信息,使用case classes

[java]  view plain  copy
  1. // sc is an existing SparkContext.  
  2. val sqlContext = new org.apache.spark.sql.SQLContext(sc)  
  3. // this is used to implicitly convert an RDD to a DataFrame.  
  4. import sqlContext.implicits._  
  5.   
  6. // Define the schema using a case class.  
  7. // Note: Case classes in Scala 2.10 can support only up to 22 fields. To work around this limit,  
  8. // you can use custom classes that implement the Product interface.  
  9. case class Person(name: String, age: Int)  
  10.   
  11. // Create an RDD of Person objects and register it as a table.  
  12. val people = sc.textFile("examples/src/main/resources/people.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt)).toDF()  
  13. people.registerTempTable("people")  
  14.   
  15. // SQL statements can be run by using the sql methods provided by sqlContext.  
  16. val teenagers = sqlContext.sql("SELECT name, age FROM people WHERE age >= 13 AND age <= 19")  
  17.   
  18. // The results of SQL queries are DataFrames and support all the normal RDD operations.  
  19. // The columns of a row in the result can be accessed by field index:  
  20. teenagers.map(t => "Name: " + t(0)).collect().foreach(println)  
  21.   
  22. // or by field name:  
  23. teenagers.map(t => "Name: " + t.getAs[String]("name")).collect().foreach(println)  
  24.   
  25. // row.getValuesMap[T] retrieves multiple columns at once into a Map[String, T]  
  26. teenagers.map(_.getValuesMap[Any](List("name""age"))).collect().foreach(println)  
  27. // Map("name" -> "Justin", "age" -> 19)  


2、不使用case classes
[java]  view plain  copy
  1. // sc is an existing SparkContext.  
  2. val sqlContext = new org.apache.spark.sql.SQLContext(sc)  
  3.   
  4. // Create an RDD  
  5. val people = sc.textFile("examples/src/main/resources/people.txt")  
  6.   
  7. // The schema is encoded in a string  
  8. val schemaString = "name age"  
  9.   
  10. // Import Row.  
  11. import org.apache.spark.sql.Row;  
  12.   
  13. // Import Spark SQL data types  
  14. import org.apache.spark.sql.types.{StructType,StructField,StringType};  
  15.   
  16. // Generate the schema based on the string of schema  
  17. val schema =  
  18.   StructType(  
  19.     schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true)))  
  20.   
  21. // Convert records of the RDD (people) to Rows.  
  22. val rowRDD = people.map(_.split(",")).map(p => Row(p(0), p(1).trim))  
  23.   
  24. // Apply the schema to the RDD.  
  25. val peopleDataFrame = sqlContext.createDataFrame(rowRDD, schema)  
  26.   
  27. // Register the DataFrames as a table.  
  28. peopleDataFrame.registerTempTable("people")  
  29.   
  30. // SQL statements can be run by using the sql methods provided by sqlContext.  
  31. val results = sqlContext.sql("SELECT name FROM people")  
  32.   
  33. // The results of SQL queries are DataFrames and support all the normal RDD operations.  
  34. // The columns of a row in the result can be accessed by field index or by field name.  
  35. results.map(t => "Name: " + t(0)).collect().foreach(println)  

六、数据源

1、从parquet格式的文件中加载/输出

[java]  view plain  copy
  1. val df = sqlContext.read.load("examples/src/main/resources/users.parquet")  
  2. df.select("name""favorite_color").write.save("namesAndFavColors.parquet")  
2、更方便的格式化,而无需像以上一样去解析

[java]  view plain  copy
  1. val df = sqlContext.read.format("json").load("examples/src/main/resources/people.json")  
  2. df.select("name""age").write.format("parquet").save("namesAndAges.parquet")  
3、Hive表

支持Hive的spark需要 -Phive 和 -Phive-thriftserver 编译spark,且需要将lib_managed/jars下的datanucleus相关jar包以及hive-site.xml 放在指定的位置。

详见spark 1.5.1 overview: http://spark.apache.org/docs/latest/sql-programming-guide.html

[java]  view plain  copy
  1. // sc is an existing SparkContext.  
  2. val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)  
  3.   
  4. sqlContext.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)")  
  5. sqlContext.sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src")  
  6.   
  7. // Queries are expressed in HiveQL  
  8. sqlContext.sql("FROM src SELECT key, value").collect().foreach(println)  

4、jdbc

需首先加载相应的jdbc驱动到spark classpath

每个工作节点上也需要能加载驱动包,可以将驱动jars放在每个节点的classpath中。

转载: http://blog.youkuaiyun.com/yueqian_zhu/article/details/49616563

内容概要:本文详细探讨了基于阻尼连续可调减振器(CDC)的半主动悬架系统的控制策略。首先建立了CDC减振器的动力学模型,验证了其阻尼特性,并通过实验确认了模型的准确性。接着,搭建了1/4车辆悬架模型,分析了不同阻尼系数对悬架性能的影响。随后,引入了PID、自适应模糊PID和模糊-PID并联三种控制策略,通过仿真比较它们的性能提升效果。研究表明,模糊-PID并联控制能最优地提升悬架综合性能,在平顺性和稳定性间取得最佳平衡。此外,还深入分析了CDC减振器的特性,优化了控制策略,并进行了系统级验证。 适用人群:从事汽车工程、机械工程及相关领域的研究人员和技术人员,尤其是对车辆悬架系统和控制策略感兴趣的读者。 使用场景及目标:①适用于研究和开发基于CDC减振器的半主动悬架系统的工程师;②帮助理解不同控制策略(如PID、模糊PID、模糊-PID并联)在悬架系统中的应用及其性能差异;③为优化车辆行驶舒适性和稳定性提供理论依据和技术支持。 其他说明:本文不仅提供了详细的数学模型和仿真代码,还通过实验数据验证了模型的准确性。对于希望深入了解CDC减振器工作原理及其控制策略的读者来说,本文是一份极具价值的参考资料。同时,文中还介绍了多种控制策略的具体实现方法及其优缺点,为后续的研究和实际应用提供了有益的借鉴。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值