创建DataFrame的方式
创建DataFrame的方式
1).读取json格式的文件
a).json文件不能嵌套
b).读取的两种方式:
DataFrame df = sqlContext.read().format("json").load("./sparksql/json");
DataFrame df2 = sqlContext.read().json("sparksql/json");
c).加载过来的DataFrame 列会按照Ascii码排序
d).可以使用DataFrame的API操作DataFrame,也可以将DataFrame注册成临时表
df.registerTempTable("jtable");
2).读取json格式的RDD
3).读取普通的RDD加载成DataFrame
a).反射的方式(少)
JavaRDD<Person> personRDD = lineRDD.map(new Function<String, Person>() {
private static final long serialVersionUID = 1L;
@Override
public Person call(String line) throws Exception {
Person p = new Person();
p.setId(line.split(",")[0]);
p.setName(line.split(",")[1]);
p.setAge(Integer.valueOf(line.split(",")[2]));
return p;
}
});
DataFrame df = sqlContext.createDataFrame(personRDD, Person.class);
i).自定类要实现序列化接口
ii).自定义类的访问级别是public
iii).加载过来的DataFrame列也会按照Ascii码排序
b).动态创建Schema(多)
List<StructField> asList =Arrays.asList(
DataTypes.createStructField("id", DataTypes.StringType, true),
DataTypes.createStructField("name", DataTypes.StringType, true),
DataTypes.createStructField("age", DataTypes.IntegerType, true)
);
StructType schema = DataTypes.createStructType(asList);
DataFrame df = sqlContext.createDataFrame(rowRDD, schema);
i).加载过来的DataFrame列不会按照Ascii码排序
4).读取parquent文件加载成DataFrame
读取:
DataFrame load = sqlContext.read().format("parquet").load("./sparksql/parquet");
load = sqlContext.read().parquet("./sparksql/parquet");
存储:
df.write().mode(SaveMode.Overwrite).format("parquet").save("./sparksql/parquet");
df.write().mode(SaveMode.Ignore).parquet("./sparksql/parquet");
5).读取Mysql中的数据加载成DataFrame
读取:
a).
Map<String, String> options = new HashMap<String,String>();
options.put("url", "jdbc:mysql://192.168.179.4:3306/spark");
options.put("driver", "com.mysql.jdbc.Driver");
options.put("user", "root");
options.put("password", "123456");
options.put("dbtable", "person");
DataFrame person = sqlContext.read().format("jdbc").options(options).load();
b).
DataFrameReader reader = sqlContext.read().format("jdbc");
reader.option("url", "jdbc:mysql://192.168.179.4:3306/spark");
reader.option("driver", "com.mysql.jdbc.Driver");
reader.option("user", "root");
reader.option("password", "123456");
reader.option("dbtable", "score");
DataFrame score = reader.load();
存储:
Properties properties = new Properties();
properties.setProperty("user", "root");
properties.setProperty("password", "123456");
result.write().mode(SaveMode.Overwrite).jdbc("jdbc:mysql://192.168.179.4:3306/spark", "result", properties);
6).读取Hive中的数据加载成DataFrame
要配置Spark on Hive,如果SparkSQL要读取数据是Hive中数据,要使用HiveContext,HiveContext是SQLContext的子类。
读取:
HiveContext hiveContext = new HiveContext(sc);
hiveContext.sql("USE spark");
DataFrame df = hiveContext.table("good_student_infos");
存储:
hiveContext.sql("DROP TABLE IF EXISTS good_student_infos");
goodStudentsDF.write().mode(SaveMode.Overwrite).saveAsTable("good_student_infos");
配置spark on Hive:
5.配置Spark on Hive
1).在客户端创建../conf/hive-site.xml
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://node1:9083</value>
</property>
</configuration>
2).启动Hive,在服务端启动metaStore服务,hive --service metastore
3).spark-shell 测试
谢谢你的鼓励,继续加油。