尝试从Spark(-shell)访问PostgreSQL
我整理了一下使用Spark的交互式Shell Spark-shell访问PostgreSQL并进行一些试验的步骤,作为备忘录。
下面是执行环境。需要注意的是,省略了PostgreSQL的安装和设置步骤。
CentOS 7.5、PostgreSQL 9.2.23、Apache Spark 2.3.1
Apache Spark (中文名称为”火花”)
使用开源框架,在内存中从不同的数据存储(Hadoop/Cassandra/RDB)中提取、处理和传递数据
安装Apache Spark
请参考此处进行Java环境的安装。
yum search openjdk
yum install java-1.8.0-openjdk
yum install java-1.8.0-openjdk-devel
安装Apache Spark
wget http://ftp.jaist.ac.jp/pub/apache/spark/spark-2.3.1/spark-2.3.1-bin-hadoop2.7.tgz
tar zxvf spark-1.6.1-bin-hadoop2.6.tgz -C /usr/local/lib/
ln -s /usr/local/lib/spark-2.3.1-bin-hadoop2.7 /usr/local/lib/spark
設定環境變數並確認啟動Spark-shell。
vi /etc/profile.d/spark.sh
export SPARK_HOME=/usr/local/lib/spark
export PATH=$SPARK_HOME/bin:$PATH
source /etc/profile
spark-shell --version

在中文中本地化以下内容,仅提供一种选择:
安装JDBC驱动程序
yum -y install postgresql-jdbc
find / -name postgre*.jar
从Spark Shell连接到PostgreSQL。
启动交互式Shell并指定CLASSPATH。
spark-shell --driver-class-path=/usr/share/java/postgresql-jdbc.jar
加载 PostgreSQL 数据库 “mydb” 中的 public.account 表的数据。
val jdbcDF = spark.read.format("jdbc").option("url", "jdbc:postgresql://localhost:5432/mydb").option("dbtable", "public.account").option("user", "postgres").load()
jdbcDF.filter(jdbcDF("id")<10).show()

将public.account表中的数据复制(追加)到public.account_bk表中。
val prop = new java.util.Properties
prop.setProperty("driver", "org.postgresql.Driver")
prop.setProperty("user", "postgres")
prop.setProperty("password", "postgres")
jdbcDF.write.mode("append").jdbc("jdbc:postgresql://localhost:5432/mydb", "public.account_bk", prop)
val jdbcDF1 = spark.read.format("jdbc").option("url", "jdbc:postgresql://localhost:5432/mydb").option("dbtable", "public.account_bk").option("user", "postgres").load()
jdbcDF1.show()

Spark-shell的结束
scala>Press (Ctrl+D)