读写es
spark 读 es
properties = {
'es.nodes.wan.only': True,
'es.nodes': "host:port,host:por,host:por",
'es.port': 9202,
'es.net.http.auth.user': 'user',
'es.net.http.auth.pass': 'pass',
'es.batch.size.entries': 10000,
'es.batch.size.bytes': 200 * 1024 * 1024
}
df = spark.read.format('es').options(**properties).load('hive_table').show()
spark 写 es
properties = {
'es.nodes.wan.only': True,
'es.nodes': "host:por,host:por,host:por",
'es.port': 9202,
'es.net.http.auth.user': 'user',
'es.net.http.auth.pass': 'pass',
'es.batch.size.entries': 10000,
'es.batch.size.bytes': 200 * 1024 * 1024
}
df = spark.read.format('es').options(**properties).load('hive_table').show()
df.write.format('org.elasticsearch.spark.sql').options(**properties ).mode('append').save("hive_table")
读写mysql
- 网上常规的读取mysql方法
prop = {'user': user,
'password': password,
'driver': 'com.mysql.cj.jdbc.Driver'}
spark = SparkSession.builder.enableHiveSupport().getOrCreate()
df = spark.read.jdbc(
f'jdbc:mysql://{host}:{port}/database?useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8',
'table_name', properties=prop)
但是这样会有一个问题,会直接把mysql的全表读取进内存,之后才能再使用df.filter或df.where的方法进行过滤,万一mysql的数据量很大,那就明显得不偿失。
- 按照sql进行读取(网上很少)
prop = {'user': user,
'password': password,
'driver': 'com.mysql.cj.jdbc.Driver',
'url': f'jdbc:mysql://{host}:{port}/?useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8',
'query': 'select * from table where confirm_flag=1'}
spark = SparkSession.builder.config('spark.sql.hive.convertMetastoreParquet', False).enableHiveSupport().getOrCreate()
df = spark.read.format('jdbc').options(**prop).load()
其中,query可以用dbtable代替
dbtable:应该读取或者写入的JDBC表,可以使用SQL查询的FROM子句中有效的任何内容,比如,你可以使用括号中的子查询代替完整表,但是“dbtable”和“query”不可以同时使用。