1. 程式人生 > >julia第三方包引入方法及JDBC操作

julia第三方包引入方法及JDBC操作

微信公眾號(SZBigdata-Club):後續部落格的文件都會轉到微信公眾號中。  1、公眾號會持續給大家推送技術文件、學習視訊、技術書籍、資料集等。  2、接受大家投稿支援。  3、對於各公司hr招聘的,可以私下聯絡我,把招聘資訊發給我我會在公眾號中進行推送。 

è¿éåå¾çæè¿° 技術交流群:59701880 深圳廣州hadoop好友會 

è¿éåå¾çæè¿°

第三方包引入

引入Pkg

import Pkg

引入第三方包方法

相容 v0.6 和 v0.7 (1.0的pre-release),請通過Julia自帶的包管理器進行安裝。 在 v0.6 中,請使用 Pkg 模組進行安裝

julia> Pkg.clone("https://github.com/Roger-luo/TutorialZH.jl.git")

在 v0.7 中,請使用REPL的 pkg mode 安裝,按 ] 鍵

(v0.7) pkg> dev https://github.com/Roger-luo/TutorialZH.jl.git#master

或者使用 Pkg 模組

julia> using Pkg; Pkg.develop("https://github.com/Roger-luo/TutorialZH.jl.git#master")

具體操作如下:

julia>import Pkg

julia> Pkg.clone("https://github.com/JuliaDatabases/JDBC.jl.git")
┌ Warning: Pkg.clone is only kept for legacy CI script reasons, please use `add
`
└ @ Pkg.API C:\cygwin\home\Administrator\buildbot\worker\package_win64\build\us
r\share\julia\stdlib\v1.0\Pkg\src\API.jl:445
   Cloning default registries into C:\Users\dell\.julia\registries
   Cloning registry General from "https://github.com/JuliaRegistries/General.git
"
  Updating registry at `C:\Users\dell\.julia\registries\General`
  Updating git-repo `https://github.com/JuliaRegistries/General.git`
   Cloning git-repo `https://github.com/JuliaDatabases/JDBC.jl.git`
  Updating git-repo `https://github.com/JuliaDatabases/JDBC.jl.git`
 Resolving package versions...
   Cloning [ea10d353-3f73-51f8-a26c-33c1cb351aa5] WeakRefStrings from https://gi
thub.com/JuliaData/WeakRefStrings.jl.git
[ Info: Installed WeakRefStrings ─ v0.5.2
   Cloning [1b915085-20d7-51cf-bf83-8f477d6f5128] WinReg from https://github.com
/simonbyrne/WinReg.jl.git
[ Info: Installed WinReg ───────── v0.3.1
   Cloning [9a8bc11e-79be-5b39-94d7-1ccc349a1a85] DataStreams from https://githu
b.com/JuliaData/DataStreams.jl.git
[ Info: Installed DataStreams ──── v0.4.0
   Cloning [864edb3b-99cc-5e75-8d2d-829cb0a9cfe8] DataStructures from https://gi
thub.com/JuliaCollections/DataStructures.jl.git
[ Info: Installed DataStructures ─ v0.11.1
   Cloning [494afd89-becb-516b-aafa-70d2670c0337] JavaCall from https://github.c
om/JuliaInterop/JavaCall.jl.git
[ Info: Installed JavaCall ─────── v0.7.1
   Cloning [e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28] Missings from https://github.c
om/JuliaData/Missings.jl.git
[ Info: Installed Missings ─────── v0.3.0
  Updating `C:\Users\dell\.julia\environments\v1.0\Project.toml`
  [6042db11] + JDBC v0.4.0+ [`C:\Users\dell\.julia\dev\JDBC`]
  Updating `C:\Users\dell\.julia\environments\v1.0\Manifest.toml`
  [9a8bc11e] + DataStreams v0.4.0
  [864edb3b] + DataStructures v0.11.1
  [6042db11] + JDBC v0.4.0+ [`C:\Users\dell\.julia\dev\JDBC`]
  [494afd89] + JavaCall v0.7.1
  [e1d29d7a] + Missings v0.3.0
  [ea10d353] + WeakRefStrings v0.5.2
  [1b915085] + WinReg v0.3.1
  [2a0f44e3] + Base64
  [ade2ca70] + Dates
  [8ba89e20] + Distributed
  [b77e0a4c] + InteractiveUtils
  [76f85450] + LibGit2
  [8f399da3] + Libdl
  [37e2e46d] + LinearAlgebra
  [56ddb016] + Logging
  [d6f4376e] + Markdown
  [44cfe95a] + Pkg
  [de0858da] + Printf
  [3fa0cd96] + REPL
  [9a3f8284] + Random
  [ea8e919c] + SHA
  [9e88b42a] + Serialization
  [6462fe0b] + Sockets
  [2f01184e] + SparseArrays
  [8dfed614] + Test
  [cf7118a7] + UUIDs
  [4ec0a83e] + Unicode

初始化以及銷燬

載入資料庫驅動包並初始化JVM

julia> using JDBC
[ Info: Precompiling JDBC [6042db11-3c3d-5e84-8dba-9cbf74c9ba48]
julia> JDBC.usedriver("F:\\mysql-connector-java-5.1.26.jar")
julia> JDBC.init()

初始化之後,除非顯式地銷燬JVM,否則它將保留在記憶體中。我們可以通過以下程式碼來銷燬釋放記憶體

JDBC.destroy() # or JavaCall.destroy()

API操作介面

這裡提供了兩種連線操作方式:java、julia。 接下來對這兩種方式進行具體介紹

Java API

JDBC.jl提供的功能與我們平時使用的java jdbc驅動程式類似,可以使用和java類似的jdbc操作程式碼實現資料操作。

julia> conn = DriverManager.getConnection("jdbc:mysql://192.168.2.34:3306/Test?user=root&password=root")
JavaCall.JavaObject{Symbol("java.sql.Connection")}(Ptr{Nothing} @0x000000002e26e
f80)

julia> stmt = createStatement(conn)
JavaCall.JavaObject{Symbol("java.sql.Statement")}(Ptr{Nothing} @0x000000002e26ef
90)

julia> rs = executeQuery(stmt, "select * from T_Users")
JavaCall.JavaObject{Symbol("java.sql.ResultSet")}(Ptr{Nothing} @0x000000002e26ef
a8)

julia> for r in rs
           println(getInt(r,1),getString(r,"username"))
       end
1 user1
2 user2
3 user3
4 user4
5 user5
  • getInt

  • getFloat

  • getString

  • getShort

  • getByte

  • getTime

  • getTimeStamp

  • getDate

  • getBoolean

  • getNString

  • getURL  

更新

PreparedStatement具有針對不同型別定義的SETER函式,與上述的getter函式對應

ppstmt = prepareStatement(conn, "insert into firsttable values (?, ?)")
setInt(ppstmt, 1,10)
setString(ppstmt, 2,"TEN")
executeUpdate(ppstmt)
cstmt = JDBC.prepareCall(conn, "CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY(?, ?)")
setString(cstmt, 1, "derby.locks.deadlockTimeout")
setString(cstmt, 2, "10")
execute(cstmt)

Metadata

通過executeQuery方法獲取JResultSet物件,在通過getTableMetaData去獲取(column_name, column_type)tuples列表.

conn = DriverManager.getConnection("jdbc:mysql://192.168.2.34:3306/Test?user=root&password=root")
stmt = createStatement(conn)
rs = executeQuery(stmt, "select * from firsttable")
metadata = getTableMetaData(rs)

Julian介面

julia介面方式的JDBC互動涉及2個物件:JDBC.CONTION和JDBC.CURSOR物件。

julia> cnxn = JDBC.Connection("jdbc:mysql://192.168.2.34:3306/Test?user=root&password=root")
JDBC.Connection(JavaCall.JavaObject{Symbol("java.sql.Connection")}(Ptr{Nothing}
@0x000000002e26f020))

julia> csr = JDBC.Cursor(cnxn)
JDBC.Cursor(JDBC.Connection(JavaCall.JavaObject{Symbol("java.sql.Connection")}(P
tr{Nothing} @0x000000002e26f020)), JavaCall.JavaObject{Symbol("java.sql.Statemen
t")}(Ptr{Nothing} @0x000000002e26f008), nothing)

julia> execute!(csr,"insert into T_Users(username,password) values('u1','p1');")


julia> execute!(csr,"select * from T_Users;")

julia> for row ∈ rows(csr)
           print(row)
       end
(1, "user1", "password1")(2, "user2", "password2")(3, "user3", "password3")(4, "
user4", "password4")(5, "user5", "password5")(6, "u1", "p1")
julia> close(csr)

'∈'? julia語言真的是涵蓋了太多的記憶體,就如作者說的,他在julia裡面做了很多千奇百怪的事情。

DataStreams介面以及建立DataStreams

JDBC物件包含了一個DataStreams介面,一個DataStreams source物件可以從JDBC.Cursor或者JDBCRowIterator建立,物件繼承自DStream Data.Source介面,可以用於檢索元資料

這對於將資料從資料庫載入到實現DataStreams Data.Sink介面(如DataFrame)的物件中也很有用,更提供了方便的JDBC.Load函式。

舉個例子:

src = JDBC.Source(csr)  # create a Source from a JDBC.Cursor
# here we load into a DataFrame, but can be any Data.Sink
df = JDBC.load(DataFrame, src)

# you can also load from the cursor directly
df = JDBC.load(DataFrame, csr)

最快速的方法將資料載入到DataFrame

cnxn_str = "jdbc:mysql://192.168.2.34:3306/Test?u
ser=root&password=root"  # for example
df = JDBC.load(DataFrame, cursor(cnxn_str), "select * from sometable")

注意,這不僅適用於DataFrame,也適用於任何Data.Sink。 更多的方法請參考methods(JDBC.load)

注意事項

  • 不支援BLOB

  • 雖然JDBC API的很大一部分已經包裝好了,但並不是所有東西都包裝好了。如果你發現你需要的東西少了,可以提交issue到該專案。不管怎樣,直接使用JavaCall呼叫Java方法非常容易,具體可參考JDBC.jl實現。

  • julia的DateTime和java的java.sql.Date不儲存任何時區資訊。時區很容易出錯,所以請再次檢查您的應用程式是否依賴於準確的時間。

  • Java中有許多不同的JDBC驅動程式。這個包需要各種各樣的測試。

參考連結:http://juliainterop.github.io/JavaCall.jl/faq.html