diff --git a/SparkOpOpenGauss/.idea/.gitignore b/SparkOpOpenGauss/.idea/.gitignore
new file mode 100644
index 00000000..db193d80
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/.gitignore
@@ -0,0 +1,10 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/../../../../:\gitRepo\SparkOpOG\.idea/dataSources/
+/dataSources.local.xml
+# Zeppelin ignored files
+/ZeppelinRemoteNotebooks/
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/SparkOpOpenGauss/.idea/SparkOpOGForTest.iml b/SparkOpOpenGauss/.idea/SparkOpOGForTest.iml
new file mode 100644
index 00000000..78b2cc53
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/SparkOpOGForTest.iml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/SparkOpOpenGauss/.idea/SparkOpOpenGauss.iml b/SparkOpOpenGauss/.idea/SparkOpOpenGauss.iml
new file mode 100644
index 00000000..78b2cc53
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/SparkOpOpenGauss.iml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/SparkOpOpenGauss/.idea/codeStyles/Project.xml b/SparkOpOpenGauss/.idea/codeStyles/Project.xml
new file mode 100644
index 00000000..919ce1f1
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/codeStyles/Project.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SparkOpOpenGauss/.idea/codeStyles/codeStyleConfig.xml b/SparkOpOpenGauss/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 00000000..a55e7a17
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/SparkOpOpenGauss/.idea/compiler.xml b/SparkOpOpenGauss/.idea/compiler.xml
new file mode 100644
index 00000000..c9bd0573
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/compiler.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SparkOpOpenGauss/.idea/dataSources.xml b/SparkOpOpenGauss/.idea/dataSources.xml
new file mode 100644
index 00000000..481af398
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/dataSources.xml
@@ -0,0 +1,11 @@
+
+
+
+
+ postgresql
+ true
+ org.postgresql.Driver
+ jdbc:postgresql://10.11.6.27:15432/postgres
+
+
+
\ No newline at end of file
diff --git a/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3.xml b/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3.xml
new file mode 100644
index 00000000..76bd8a63
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3.xml
@@ -0,0 +1,1338 @@
+
+
+
+
+ 9.2.4
+ mdy
+ true ACSST
+true ACST
+false ACT
+true ADT
+true AESST
+false AEST
+false AFT
+true AKDT
+false AKST
+true ALMST
+false ALMT
+true AMST
+false AMT
+true ANAST
+false ANAT
+true ARST
+false ART
+false AST
+true AWSST
+false AWST
+true AZOST
+false AZOT
+true AZST
+false AZT
+false Africa/Abidjan
+false Africa/Accra
+false Africa/Addis_Ababa
+false Africa/Algiers
+false Africa/Asmara
+false Africa/Asmera
+false Africa/Bamako
+false Africa/Bangui
+false Africa/Banjul
+false Africa/Bissau
+false Africa/Blantyre
+false Africa/Brazzaville
+false Africa/Bujumbura
+false Africa/Cairo
+false Africa/Casablanca
+true Africa/Ceuta
+false Africa/Conakry
+false Africa/Dakar
+false Africa/Dar_es_Salaam
+false Africa/Djibouti
+false Africa/Douala
+false Africa/El_Aaiun
+false Africa/Freetown
+false Africa/Gaborone
+false Africa/Harare
+false Africa/Johannesburg
+false Africa/Juba
+false Africa/Kampala
+false Africa/Khartoum
+false Africa/Kigali
+false Africa/Kinshasa
+false Africa/Lagos
+false Africa/Libreville
+false Africa/Lome
+false Africa/Luanda
+false Africa/Lubumbashi
+false Africa/Lusaka
+false Africa/Malabo
+false Africa/Maputo
+false Africa/Maseru
+false Africa/Mbabane
+false Africa/Mogadishu
+false Africa/Monrovia
+false Africa/Nairobi
+false Africa/Ndjamena
+false Africa/Niamey
+false Africa/Nouakchott
+false Africa/Ouagadougou
+false Africa/Porto-Novo
+false Africa/Sao_Tome
+false Africa/Timbuktu
+false Africa/Tripoli
+false Africa/Tunis
+false Africa/Windhoek
+true America/Adak
+true America/Anchorage
+false America/Anguilla
+false America/Antigua
+false America/Araguaina
+false America/Argentina/Buenos_Aires
+false America/Argentina/Catamarca
+false America/Argentina/ComodRivadavia
+false America/Argentina/Cordoba
+false America/Argentina/Jujuy
+false America/Argentina/La_Rioja
+false America/Argentina/Mendoza
+false America/Argentina/Rio_Gallegos
+false America/Argentina/Salta
+false America/Argentina/San_Juan
+false America/Argentina/San_Luis
+false America/Argentina/Tucuman
+false America/Argentina/Ushuaia
+false America/Aruba
+false America/Asuncion
+false America/Atikokan
+true America/Atka
+false America/Bahia
+true America/Bahia_Banderas
+false America/Barbados
+false America/Belem
+false America/Belize
+false America/Blanc-Sablon
+false America/Boa_Vista
+false America/Bogota
+true America/Boise
+false America/Buenos_Aires
+true America/Cambridge_Bay
+false America/Campo_Grande
+false America/Cancun
+false America/Caracas
+false America/Catamarca
+false America/Cayenne
+false America/Cayman
+true America/Chicago
+true America/Chihuahua
+false America/Coral_Harbour
+false America/Cordoba
+false America/Costa_Rica
+false America/Creston
+false America/Cuiaba
+false America/Curacao
+false America/Danmarkshavn
+false America/Dawson
+false America/Dawson_Creek
+true America/Denver
+true America/Detroit
+false America/Dominica
+true America/Edmonton
+false America/Eirunepe
+false America/El_Salvador
+true America/Ensenada
+true America/Fort_Wayne
+false America/Fortaleza
+true America/Glace_Bay
+true America/Godthab
+true America/Goose_Bay
+true America/Grand_Turk
+false America/Grenada
+false America/Guadeloupe
+false America/Guatemala
+false America/Guayaquil
+false America/Guyana
+true America/Halifax
+true America/Havana
+false America/Hermosillo
+true America/Indiana/Indianapolis
+true America/Indiana/Knox
+true America/Indiana/Marengo
+true America/Indiana/Petersburg
+true America/Indiana/Tell_City
+true America/Indiana/Vevay
+true America/Indiana/Vincennes
+true America/Indiana/Winamac
+true America/Indianapolis
+true America/Inuvik
+true America/Iqaluit
+false America/Jamaica
+false America/Jujuy
+true America/Juneau
+true America/Kentucky/Louisville
+true America/Kentucky/Monticello
+true America/Knox_IN
+false America/Kralendijk
+false America/La_Paz
+false America/Lima
+true America/Los_Angeles
+true America/Louisville
+false America/Lower_Princes
+false America/Maceio
+false America/Managua
+false America/Manaus
+false America/Marigot
+false America/Martinique
+true America/Matamoros
+true America/Mazatlan
+false America/Mendoza
+true America/Menominee
+true America/Merida
+true America/Metlakatla
+true America/Mexico_City
+true America/Miquelon
+true America/Moncton
+true America/Monterrey
+false America/Montevideo
+true America/Montreal
+false America/Montserrat
+true America/Nassau
+true America/New_York
+true America/Nipigon
+true America/Nome
+false America/Noronha
+true America/North_Dakota/Beulah
+true America/North_Dakota/Center
+true America/North_Dakota/New_Salem
+true America/Ojinaga
+false America/Panama
+true America/Pangnirtung
+false America/Paramaribo
+false America/Phoenix
+true America/Port-au-Prince
+false America/Port_of_Spain
+false America/Porto_Acre
+false America/Porto_Velho
+false America/Puerto_Rico
+true America/Rainy_River
+true America/Rankin_Inlet
+false America/Recife
+false America/Regina
+true America/Resolute
+false America/Rio_Branco
+false America/Rosario
+true America/Santa_Isabel
+false America/Santarem
+true America/Santiago
+false America/Santo_Domingo
+false America/Sao_Paulo
+true America/Scoresbysund
+true America/Shiprock
+true America/Sitka
+false America/St_Barthelemy
+true America/St_Johns
+false America/St_Kitts
+false America/St_Lucia
+false America/St_Thomas
+false America/St_Vincent
+false America/Swift_Current
+false America/Tegucigalpa
+true America/Thule
+true America/Thunder_Bay
+true America/Tijuana
+true America/Toronto
+false America/Tortola
+true America/Vancouver
+false America/Virgin
+false America/Whitehorse
+true America/Winnipeg
+true America/Yakutat
+true America/Yellowknife
+false Antarctica/Casey
+false Antarctica/Davis
+false Antarctica/DumontDUrville
+false Antarctica/Macquarie
+false Antarctica/Mawson
+false Antarctica/McMurdo
+false Antarctica/Palmer
+false Antarctica/Rothera
+false Antarctica/South_Pole
+false Antarctica/Syowa
+false Antarctica/Vostok
+true Arctic/Longyearbyen
+false Asia/Aden
+false Asia/Almaty
+true Asia/Amman
+false Asia/Anadyr
+false Asia/Aqtau
+false Asia/Aqtobe
+false Asia/Ashgabat
+false Asia/Ashkhabad
+false Asia/Baghdad
+false Asia/Bahrain
+false Asia/Baku
+false Asia/Bangkok
+false Asia/Beijing
+true Asia/Beirut
+false Asia/Bishkek
+false Asia/Brunei
+false Asia/Calcutta
+false Asia/Choibalsan
+false Asia/Chongqing
+false Asia/Chungking
+false Asia/Colombo
+false Asia/Dacca
+true Asia/Damascus
+false Asia/Dhaka
+false Asia/Dili
+false Asia/Dubai
+false Asia/Dushanbe
+true Asia/Gaza
+false Asia/Harbin
+true Asia/Hebron
+false Asia/Ho_Chi_Minh
+false Asia/Hong_Kong
+false Asia/Hovd
+false Asia/Irkutsk
+false Asia/Istanbul
+false Asia/Jakarta
+false Asia/Jayapura
+true Asia/Jerusalem
+false Asia/Kabul
+false Asia/Kamchatka
+false Asia/Karachi
+false Asia/Kashgar
+false Asia/Kathmandu
+false Asia/Katmandu
+false Asia/Khandyga
+false Asia/Kolkata
+false Asia/Krasnoyarsk
+false Asia/Kuala_Lumpur
+false Asia/Kuching
+false Asia/Kuwait
+false Asia/Macao
+false Asia/Macau
+false Asia/Magadan
+false Asia/Makassar
+false Asia/Manila
+false Asia/Muscat
+true Asia/Nicosia
+false Asia/Novokuznetsk
+false Asia/Novosibirsk
+false Asia/Omsk
+false Asia/Oral
+false Asia/Phnom_Penh
+false Asia/Pontianak
+false Asia/Pyongyang
+false Asia/Qatar
+false Asia/Qyzylorda
+false Asia/Rangoon
+false Asia/Riyadh
+false Asia/Saigon
+false Asia/Sakhalin
+false Asia/Samarkand
+false Asia/Seoul
+false Asia/Shanghai
+false Asia/Singapore
+false Asia/Taipei
+false Asia/Tashkent
+false Asia/Tbilisi
+true Asia/Tehran
+true Asia/Tel_Aviv
+false Asia/Thimbu
+false Asia/Thimphu
+false Asia/Tokyo
+false Asia/Ujung_Pandang
+false Asia/Ulaanbaatar
+false Asia/Ulan_Bator
+false Asia/Urumqi
+false Asia/Ust-Nera
+false Asia/Vientiane
+false Asia/Vladivostok
+false Asia/Yakutsk
+false Asia/Yekaterinburg
+false Asia/Yerevan
+true Atlantic/Azores
+true Atlantic/Bermuda
+true Atlantic/Canary
+false Atlantic/Cape_Verde
+true Atlantic/Faeroe
+true Atlantic/Faroe
+true Atlantic/Jan_Mayen
+true Atlantic/Madeira
+false Atlantic/Reykjavik
+false Atlantic/South_Georgia
+false Atlantic/St_Helena
+false Atlantic/Stanley
+false Australia/ACT
+false Australia/Adelaide
+false Australia/Brisbane
+false Australia/Broken_Hill
+false Australia/Canberra
+false Australia/Currie
+false Australia/Darwin
+false Australia/Eucla
+false Australia/Hobart
+false Australia/LHI
+false Australia/Lindeman
+false Australia/Lord_Howe
+false Australia/Melbourne
+false Australia/NSW
+false Australia/North
+false Australia/Perth
+false Australia/Queensland
+false Australia/South
+false Australia/Sydney
+false Australia/Tasmania
+false Australia/Victoria
+false Australia/West
+false Australia/Yancowinna
+true BDST
+false BDT
+false BNT
+false BORT
+false BOT
+false BRA
+true BRST
+false BRT
+true BST
+false BTT
+false Brazil/Acre
+false Brazil/DeNoronha
+false Brazil/East
+false Brazil/West
+true CADT
+false CAST
+false CCT
+true CDT
+true CEST
+true CET
+true CETDST
+true CHADT
+false CHAST
+false CHUT
+false CKT
+true CLST
+false CLT
+false COT
+false CST
+true CST6CDT
+false CXT
+true Canada/Atlantic
+true Canada/Central
+true Canada/Eastern
+true Canada/Mountain
+true Canada/Newfoundland
+true Canada/Pacific
+false Canada/Saskatchewan
+false Canada/Yukon
+true Chile/Continental
+true Chile/EasterIsland
+true Cuba
+false DAVT
+false DDUT
+true EASST
+false EAST
+false EAT
+true EDT
+true EEST
+false EET
+true EETDST
+true EGST
+false EGT
+false EST
+true EST5EDT
+false Egypt
+false Eire
+false Etc/GMT
+false Etc/GMT+0
+false Etc/GMT+1
+false Etc/GMT+10
+false Etc/GMT+11
+false Etc/GMT+12
+false Etc/GMT+2
+false Etc/GMT+3
+false Etc/GMT+4
+false Etc/GMT+5
+false Etc/GMT+6
+false Etc/GMT+7
+false Etc/GMT+8
+false Etc/GMT+9
+false Etc/GMT-0
+false Etc/GMT-1
+false Etc/GMT-10
+false Etc/GMT-11
+false Etc/GMT-12
+false Etc/GMT-13
+false Etc/GMT-14
+false Etc/GMT-2
+false Etc/GMT-3
+false Etc/GMT-4
+false Etc/GMT-5
+false Etc/GMT-6
+false Etc/GMT-7
+false Etc/GMT-8
+false Etc/GMT-9
+false Etc/GMT0
+false Etc/Greenwich
+false Etc/UCT
+false Etc/UTC
+false Etc/Universal
+false Etc/Zulu
+true Europe/Amsterdam
+true Europe/Andorra
+true Europe/Athens
+true Europe/Belfast
+true Europe/Belgrade
+true Europe/Berlin
+true Europe/Bratislava
+true Europe/Brussels
+true Europe/Bucharest
+true Europe/Budapest
+true Europe/Busingen
+true Europe/Chisinau
+true Europe/Copenhagen
+false Europe/Dublin
+true Europe/Gibraltar
+true Europe/Guernsey
+true Europe/Helsinki
+true Europe/Isle_of_Man
+false Europe/Istanbul
+true Europe/Jersey
+false Europe/Kaliningrad
+true Europe/Kiev
+true Europe/Lisbon
+true Europe/Ljubljana
+true Europe/London
+true Europe/Luxembourg
+true Europe/Madrid
+true Europe/Malta
+true Europe/Mariehamn
+false Europe/Minsk
+true Europe/Monaco
+false Europe/Moscow
+true Europe/Nicosia
+true Europe/Oslo
+true Europe/Paris
+true Europe/Podgorica
+true Europe/Prague
+true Europe/Riga
+true Europe/Rome
+false Europe/Samara
+true Europe/San_Marino
+true Europe/Sarajevo
+false Europe/Simferopol
+true Europe/Skopje
+true Europe/Sofia
+true Europe/Stockholm
+true Europe/Tallinn
+true Europe/Tirane
+true Europe/Tiraspol
+true Europe/Uzhgorod
+true Europe/Vaduz
+true Europe/Vatican
+true Europe/Vienna
+true Europe/Vilnius
+false Europe/Volgograd
+true Europe/Warsaw
+true Europe/Zagreb
+true Europe/Zaporozhye
+true Europe/Zurich
+false FET
+true FJST
+false FJT
+true FKST
+false FKT
+true FNST
+false FNT
+false GALT
+false GAMT
+true GB
+true GB-Eire
+true GEST
+false GET
+false GFT
+false GILT
+false GMT
+false GMT+0
+false GMT-0
+false GMT0
+false GYT
+false Greenwich
+false HKT
+false HST
+false Hongkong
+false ICT
+true IDT
+false IOT
+true IRKST
+false IRKT
+false IRT
+false IST
+false Iceland
+false Indian/Antananarivo
+false Indian/Chagos
+false Indian/Christmas
+false Indian/Cocos
+false Indian/Comoro
+false Indian/Kerguelen
+false Indian/Mahe
+false Indian/Maldives
+false Indian/Mauritius
+false Indian/Mayotte
+false Indian/Reunion
+true Iran
+true Israel
+false JAYT
+false JST
+false Jamaica
+false Japan
+true KDT
+true KGST
+false KGT
+false KOST
+true KRAST
+false KRAT
+false KST
+false Kwajalein
+true LHDT
+false LHST
+false LIGT
+false LINT
+false LKT
+false Libya
+true MAGST
+false MAGT
+false MART
+false MAWT
+true MDT
+true MEST
+true MET
+true METDST
+false MEZ
+false MHT
+false MMT
+false MPT
+true MSD
+false MSK
+false MST
+true MST7MDT
+true MUST
+false MUT
+false MVT
+false MYT
+true Mexico/BajaNorte
+true Mexico/BajaSur
+true Mexico/General
+true NDT
+false NFT
+true NOVST
+false NOVT
+false NPT
+false NST
+false NUT
+false NZ
+false NZ-CHAT
+true NZDT
+false NZST
+false NZT
+true Navajo
+true OMSST
+false OMST
+true PDT
+false PET
+true PETST
+false PETT
+false PGT
+false PHOT
+false PHT
+true PKST
+false PKT
+true PMDT
+false PMST
+false PONT
+false PRC
+false PST
+true PST8PDT
+false PWT
+true PYST
+false PYT
+false Pacific/Apia
+false Pacific/Auckland
+false Pacific/Chatham
+false Pacific/Chuuk
+true Pacific/Easter
+false Pacific/Efate
+false Pacific/Enderbury
+false Pacific/Fakaofo
+false Pacific/Fiji
+false Pacific/Funafuti
+false Pacific/Galapagos
+false Pacific/Gambier
+false Pacific/Guadalcanal
+false Pacific/Guam
+false Pacific/Honolulu
+false Pacific/Johnston
+false Pacific/Kiritimati
+false Pacific/Kosrae
+false Pacific/Kwajalein
+false Pacific/Majuro
+false Pacific/Marquesas
+false Pacific/Midway
+false Pacific/Nauru
+false Pacific/Niue
+false Pacific/Norfolk
+false Pacific/Noumea
+false Pacific/Pago_Pago
+false Pacific/Palau
+false Pacific/Pitcairn
+false Pacific/Pohnpei
+false Pacific/Ponape
+false Pacific/Port_Moresby
+false Pacific/Rarotonga
+false Pacific/Saipan
+false Pacific/Samoa
+false Pacific/Tahiti
+false Pacific/Tarawa
+false Pacific/Tongatapu
+false Pacific/Truk
+false Pacific/Wake
+false Pacific/Wallis
+false Pacific/Yap
+true Poland
+true Portugal
+false RET
+false ROC
+false ROK
+true SADT
+false SAST
+false SCT
+false SGT
+false Singapore
+false TAHT
+false TFT
+false TJT
+false TKT
+false TMT
+false TOT
+false TRUT
+false TVT
+false Turkey
+false UCT
+true ULAST
+false ULAT
+true US/Alaska
+true US/Aleutian
+false US/Arizona
+true US/Central
+true US/East-Indiana
+true US/Eastern
+false US/Hawaii
+true US/Indiana-Starke
+true US/Michigan
+true US/Mountain
+true US/Pacific
+true US/Pacific-New
+false US/Samoa
+false UT
+false UTC
+true UYST
+false UYT
+true UZST
+false UZT
+false Universal
+false VET
+true VLAST
+false VLAT
+false VOLT
+false VUT
+false W-SU
+true WADT
+false WAKT
+false WAST
+false WAT
+true WDT
+true WET
+true WETDST
+false WFT
+true WGST
+false WGT
+true YAKST
+false YAKT
+false YAPT
+true YEKST
+false YEKT
+false Z
+false Zulu
+true posixrules
+
+ 1631545452
+
+
+ 16384
+ omm
+
+
+ 14178
+ default administrative connection database
+ omm
+ 11789
+ 1
+
+
+ 32779
+ omm
+ 11791
+
+
+ 16385
+ 1
+
+
+ 10
+ 1
+ 1
+ 1
+ 1
+ 1
+
+
+ 16389
+ 1
+
+
+ 100
+ reserved schema for DELTA tables
+ 1
+ omm
+
+
+ 4988
+ dbe_perf schema
+ 1
+ omm
+
+
+ 16387
+ 9028
+ gaussdb
+
+
+ 13325
+ 2
+ omm
+
+
+ 11
+ system catalog schema
+ 2
+ omm
+
+
+ 3988
+ pkg_service schema
+ 1
+ omm
+
+
+ 2200
+ standard public schema
+ 2
+ omm
+
+
+ 4989
+ snapshot schema
+ 1
+ omm
+
+
+ 16391
+ 9315
+ sparkuser
+ 11790
+ 1
+
+
+ 13619
+ 2
+ omm
+ hdfs_fdw_handler
+ pg_catalog
+ hdfs_fdw_validator
+ pg_catalog
+
+
+ 13608
+ 2
+ omm
+ dist_fdw_handler
+ pg_catalog
+ dist_fdw_validator
+ pg_catalog
+
+
+ 13613
+ 2
+ omm
+ file_fdw_handler
+ pg_catalog
+ file_fdw_validator
+ pg_catalog
+
+
+ 13618
+ 2
+ omm
+ hdfs_fdw_handler
+ pg_catalog
+ hdfs_fdw_validator
+ pg_catalog
+
+
+ 13623
+ 2
+ omm
+ log_fdw_handler
+ pg_catalog
+ log_fdw_validator
+ pg_catalog
+
+
+ 13665
+ 2
+ omm
+ mot_fdw_handler
+ pg_catalog
+ mot_fdw_validator
+ pg_catalog
+
+
+ 403
+ b-tree index access method
+ 1
+
+
+ 405
+ hash index access method
+ 1
+
+
+ 783
+ GiST index access method
+ 1
+
+
+ 2742
+ GIN index access method
+ 1
+
+
+ 4000
+ SP-GiST index access method
+ 1
+
+
+ 4039
+ psort index access method
+ 1
+
+
+ 4239
+ cstore btree index access method
+ 1
+
+
+ 4444
+ cstore GIN index access method
+ 1
+
+
+ 13605
+ foreign-data wrapper for distfs access
+ 2
+ 1.0
+ pg_catalog
+ 11
+
+
+ 13610
+ foreign-data wrapper for flat file access
+ 2
+ 1.0
+ pg_catalog
+ 11
+
+
+ 13615
+ foreign-data wrapper for flat file access
+ 2
+ 1.0
+ pg_catalog
+ 11
+
+
+ 13626
+ data type for storing sets of (key, value) pairs
+ 2
+ 1.1
+ pg_catalog
+ 11
+
+
+ 13620
+ Foreign Data Wrapper for accessing logging data
+ 2
+ 1.0
+ pg_catalog
+ 11
+
+
+ 13662
+ foreign-data wrapper for MOT access
+ 2
+ 1.0
+ pg_catalog
+ 11
+
+
+ 11746
+ PL/pgSQL procedural language
+ 2
+ 1.0
+ pg_catalog
+ 11
+
+
+ 13667
+ provides security functionality
+ 2
+ 1.0
+ pg_catalog
+ 11
+
+
+
+
+
+
+
+ 100
+ reserved schema for DELTA tables
+ 1
+ omm
+
+
+ 4988
+ dbe_perf schema
+ 1
+ omm
+
+
+ 13325
+ 2
+ omm
+
+
+ 11
+ system catalog schema
+ 2
+ omm
+
+
+ 3988
+ pkg_service schema
+ 1
+ omm
+
+
+ 2200
+ standard public schema
+ 2
+ omm
+ 1
+
+
+ 4989
+ snapshot schema
+ 1
+ omm
+
+
+ 13619
+ 2
+ omm
+ hdfs_fdw_handler
+ pg_catalog
+ hdfs_fdw_validator
+ pg_catalog
+
+
+ 13608
+ 2
+ omm
+ dist_fdw_handler
+ pg_catalog
+ dist_fdw_validator
+ pg_catalog
+
+
+ 13613
+ 2
+ omm
+ file_fdw_handler
+ pg_catalog
+ file_fdw_validator
+ pg_catalog
+
+
+ 13618
+ 2
+ omm
+ hdfs_fdw_handler
+ pg_catalog
+ hdfs_fdw_validator
+ pg_catalog
+
+
+ 13623
+ 2
+ omm
+ log_fdw_handler
+ pg_catalog
+ log_fdw_validator
+ pg_catalog
+
+
+ 13665
+ 2
+ omm
+ mot_fdw_handler
+ pg_catalog
+ mot_fdw_validator
+ pg_catalog
+
+
+ 403
+ b-tree index access method
+ 1
+
+
+ 405
+ hash index access method
+ 1
+
+
+ 783
+ GiST index access method
+ 1
+
+
+ 2742
+ GIN index access method
+ 1
+
+
+ 4000
+ SP-GiST index access method
+ 1
+
+
+ 4039
+ psort index access method
+ 1
+
+
+ 4239
+ cstore btree index access method
+ 1
+
+
+ 4444
+ cstore GIN index access method
+ 1
+
+
+ 13605
+ foreign-data wrapper for distfs access
+ 2
+ 1.0
+ pg_catalog
+ 11
+
+
+ 13610
+ foreign-data wrapper for flat file access
+ 2
+ 1.0
+ pg_catalog
+ 11
+
+
+ 13615
+ foreign-data wrapper for flat file access
+ 2
+ 1.0
+ pg_catalog
+ 11
+
+
+ 13626
+ data type for storing sets of (key, value) pairs
+ 2
+ 1.1
+ pg_catalog
+ 11
+
+
+ 13620
+ Foreign Data Wrapper for accessing logging data
+ 2
+ 1.0
+ pg_catalog
+ 11
+
+
+ 13662
+ foreign-data wrapper for MOT access
+ 2
+ 1.0
+ pg_catalog
+ 11
+
+
+ 11746
+ PL/pgSQL procedural language
+ 2
+ 1.0
+ pg_catalog
+ 11
+
+
+ 13667
+ provides security functionality
+ 2
+ 1.0
+ pg_catalog
+ 11
+
+
+
+
+
+
+
+ 24587
+ sparkuser
+ 9908
+
+
+ 24581
+ sparkuser
+ 9612
+
+
+ 13609
+ 2
+ omm
+
+
+ 13614
+ 2
+ omm
+
+
+ 13624
+ 2
+ omm
+
+
+ 13666
+ 2
+ omm
+
+
+ 13609
+ 2
+ omm
+
+
+ 13614
+ 2
+ omm
+
+
+ 13624
+ 2
+ omm
+
+
+ 13666
+ 2
+ omm
+
+
+ 1
+ integer|0s
+ 1
+ 9908
+ 23
+
+
+ 2
+ text|0s
+ 1
+ 9908
+ 25
+
+
+ 3
+ integer|0s
+ 1
+ 9908
+ 23
+
+
+ 4
+ char(50)|0s
+ 9908
+ 1042
+
+
+ 5
+ real|0s
+ 9908
+ 700
+
+
+ 24593
+ 9908
+ id
+ 1
+ 1
+
+
+ 24594
+ 9908
+ id
+ 1
+ company1_pkey
+
+
+ 1
+ integer|0s
+ 9612
+ 23
+
+
+ 2
+ text|0s
+ 9612
+ 25
+
+
+ 3
+ numeric|0s
+ 9612
+ 1700
+
+
+
\ No newline at end of file
diff --git a/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/postgres.edMnLQ.meta b/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/postgres.edMnLQ.meta
new file mode 100644
index 00000000..5b992090
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/postgres.edMnLQ.meta
@@ -0,0 +1 @@
+#n:postgres
\ No newline at end of file
diff --git a/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/postgres.edMnLQ/schema/information_schema.FNRwLQ.meta b/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/postgres.edMnLQ/schema/information_schema.FNRwLQ.meta
new file mode 100644
index 00000000..1ff3db2e
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/postgres.edMnLQ/schema/information_schema.FNRwLQ.meta
@@ -0,0 +1,2 @@
+#n:information_schema
+! [null, 0, null, null, -2147483648, -2147483648]
diff --git a/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/postgres.edMnLQ/schema/pg_catalog.0S1ZNQ.meta b/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/postgres.edMnLQ/schema/pg_catalog.0S1ZNQ.meta
new file mode 100644
index 00000000..44e65b16
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/postgres.edMnLQ/schema/pg_catalog.0S1ZNQ.meta
@@ -0,0 +1,2 @@
+#n:pg_catalog
+! [null, 0, null, null, -2147483648, -2147483648]
diff --git a/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/postgres.edMnLQ/schema/sparkuser.KCgh4Q.meta b/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/postgres.edMnLQ/schema/sparkuser.KCgh4Q.meta
new file mode 100644
index 00000000..c1997422
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/postgres.edMnLQ/schema/sparkuser.KCgh4Q.meta
@@ -0,0 +1,2 @@
+#n:sparkuser
+! [11790, 0, null, null, -2147483648, -2147483648]
diff --git a/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/school.dFvhyQ.meta b/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/school.dFvhyQ.meta
new file mode 100644
index 00000000..d35b334d
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/school.dFvhyQ.meta
@@ -0,0 +1 @@
+#n:school
\ No newline at end of file
diff --git a/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/school.dFvhyQ/schema/information_schema.FNRwLQ.meta b/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/school.dFvhyQ/schema/information_schema.FNRwLQ.meta
new file mode 100644
index 00000000..1ff3db2e
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/school.dFvhyQ/schema/information_schema.FNRwLQ.meta
@@ -0,0 +1,2 @@
+#n:information_schema
+! [null, 0, null, null, -2147483648, -2147483648]
diff --git a/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/school.dFvhyQ/schema/pg_catalog.0S1ZNQ.meta b/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/school.dFvhyQ/schema/pg_catalog.0S1ZNQ.meta
new file mode 100644
index 00000000..44e65b16
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/dataSources/f5515d82-d7ba-4fc5-9425-f44775711cf3/storage_v2/_src_/database/school.dFvhyQ/schema/pg_catalog.0S1ZNQ.meta
@@ -0,0 +1,2 @@
+#n:pg_catalog
+! [null, 0, null, null, -2147483648, -2147483648]
diff --git a/SparkOpOpenGauss/.idea/google-java-format.xml b/SparkOpOpenGauss/.idea/google-java-format.xml
new file mode 100644
index 00000000..2aa056da
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/google-java-format.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SparkOpOpenGauss/.idea/jarRepositories.xml b/SparkOpOpenGauss/.idea/jarRepositories.xml
new file mode 100644
index 00000000..329b2f85
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/jarRepositories.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SparkOpOpenGauss/.idea/libraries/opengauss_jdbc_2_0_0.xml b/SparkOpOpenGauss/.idea/libraries/opengauss_jdbc_2_0_0.xml
new file mode 100644
index 00000000..13fbcc3e
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/libraries/opengauss_jdbc_2_0_0.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SparkOpOpenGauss/.idea/misc.xml b/SparkOpOpenGauss/.idea/misc.xml
new file mode 100644
index 00000000..4b661a5f
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/misc.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SparkOpOpenGauss/.idea/uiDesigner.xml b/SparkOpOpenGauss/.idea/uiDesigner.xml
new file mode 100644
index 00000000..e96534fb
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/SparkOpOpenGauss/.idea/vcs.xml b/SparkOpOpenGauss/.idea/vcs.xml
new file mode 100644
index 00000000..94a25f7f
--- /dev/null
+++ b/SparkOpOpenGauss/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SparkOpOpenGauss/README.md b/SparkOpOpenGauss/README.md
new file mode 100644
index 00000000..f29ae176
--- /dev/null
+++ b/SparkOpOpenGauss/README.md
@@ -0,0 +1,18 @@
+# SparkOpOpenGauss
+
+这是将 openGuass 作为数据源的spark示例代码。
+
+**环境和软件版本要求(前置要求):**
+
+1. Java 1.8
+2. Scala 2.12
+3. postgresql.jar 或 opengauss-jdbc--${version}.jar(自己打包或官方提供的jar包)
+
+**说明:**
+
+1. 请确保服务器上的数据库正常运行,且你的机器可正常连接数据库
+2. 以sparkuser用户身份执行./resources/school.sql文件
+3. 请修改代码中连接数据库的ip及端口,即修改 x.x.x.x:port 。主要代码内容在 ./src/main/scala/
+4. 可以在idea运行本示例。
+ + 可运行./src/test/scala/org/opengauss/spark/OpenGaussExample。
+ + 另一个直接使用Spark JDBC的例子是 ./src/main/scala/SQLDataSourceExample。
\ No newline at end of file
diff --git a/SparkOpOpenGauss/SparkOpOG.iml b/SparkOpOpenGauss/SparkOpOG.iml
new file mode 100644
index 00000000..78b2cc53
--- /dev/null
+++ b/SparkOpOpenGauss/SparkOpOG.iml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/SparkOpOpenGauss/libs/opengauss-jdbc-2.0.0.jar b/SparkOpOpenGauss/libs/opengauss-jdbc-2.0.0.jar
new file mode 100644
index 00000000..12320961
Binary files /dev/null and b/SparkOpOpenGauss/libs/opengauss-jdbc-2.0.0.jar differ
diff --git a/SparkOpOpenGauss/pom.xml b/SparkOpOpenGauss/pom.xml
new file mode 100644
index 00000000..16511042
--- /dev/null
+++ b/SparkOpOpenGauss/pom.xml
@@ -0,0 +1,91 @@
+
+
+ 4.0.0
+
+ org.example
+ SparkOpOG
+ 3.3.0-SNAPSHOT
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 8
+ 8
+
+
+
+ org.scalatest
+ scalatest-maven-plugin
+ 1.0
+
+ ${project.build.directory}/surefire-reports
+ .
+ WDF TestSuite.txt
+
+
+
+ test
+
+ test
+
+
+
+
+
+
+
+
+
+
+
+ org.scalatest
+ scalatest_2.12
+ 3.0.0
+ test
+
+
+ org.apache.spark
+ spark-core_2.12
+ 3.3.0-SNAPSHOT
+
+
+
+ org.apache.spark
+ spark-sql_2.12
+ 3.3.0-SNAPSHOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Apache
+ https://repository.apache.org/snapshots/
+
+ true
+
+
+
+
\ No newline at end of file
diff --git a/SparkOpOpenGauss/resources/school.sql b/SparkOpOpenGauss/resources/school.sql
new file mode 100644
index 00000000..f830b05d
--- /dev/null
+++ b/SparkOpOpenGauss/resources/school.sql
@@ -0,0 +1,214 @@
+create database school;
+
+\c school;
+
+BEGIN;
+
+-- 创建表student
+CREATE TABLE student
+(
+ std_id INT PRIMARY KEY,
+ std_name VARCHAR(20) NOT NULL,
+ std_sex VARCHAR(6),
+ std_birth DATE,
+ std_in DATE NOT NULL,
+ std_address VARCHAR(100)
+);
+
+-- 创建表teacher
+CREATE TABLE teacher
+(
+ tec_id INT PRIMARY KEY,
+ tec_name VARCHAR(20) NOT NULL,
+ tec_job VARCHAR(15),
+ tec_sex VARCHAR(6),
+ tec_age INT,
+ tec_in DATE NOT NULL
+);
+
+-- 创建表class
+CREATE TABLE class
+(
+ cla_id INT PRIMARY KEY,
+ cla_name VARCHAR(20) NOT NULL,
+ cla_teacher INT NOT NULL
+);
+-- 给表class添加外键约束
+ALTER TABLE class ADD CONSTRAINT fk_tec_id FOREIGN KEY (cla_teacher) REFERENCES teacher(tec_id) ON DELETE CASCADE;
+
+-- 创建表school_department
+CREATE TABLE school_department
+(
+ depart_id INT PRIMARY KEY,
+ depart_name VARCHAR(30) NOT NULL,
+ depart_teacher INT NOT NULL
+);
+-- 给表school_department添加外键约束
+ALTER TABLE school_department ADD CONSTRAINT fk_depart_tec_id FOREIGN KEY (depart_teacher) REFERENCES teacher(tec_id) ON DELETE CASCADE;
+
+-- 创建表course
+CREATE TABLE course
+(
+ cor_id INT PRIMARY KEY,
+ cor_name VARCHAR(30) NOT NULL,
+ cor_type VARCHAR(20),
+ credit DOUBLE PRECISION
+);
+
+-- 插入数据
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (1,'张一','男','1993-01-01','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (2,'张二','男','1993-01-02','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (3,'张三','男','1993-01-03','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (4,'张四','男','1993-01-04','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (5,'张五','男','1993-01-05','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (6,'张六','男','1993-01-06','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (7,'张七','男','1993-01-07','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (8,'张八','男','1993-01-08','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (9,'张九','男','1993-01-09','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (10,'李一','男','1993-01-10','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (11,'李二','男','1993-01-11','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (12,'李三','男','1993-01-12','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (13,'李四','男','1993-01-13','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (14,'李五','男','1993-01-14','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (15,'李六','男','1993-01-15','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (16,'李七','男','1993-01-16','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (17,'李八','男','1993-01-17','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (18,'李九','男','1993-01-18','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (19,'王一','男','1993-01-19','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (20,'王二','男','1993-01-20','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (21,'王三','男','1993-01-21','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (22,'王四','男','1993-01-22','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (23,'王五','男','1993-01-23','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (24,'王六','男','1993-01-24','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (25,'王七','男','1993-01-25','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (26,'王八','男','1993-01-26','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (27,'王九','男','1993-01-27','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (28,'钱一','男','1993-01-28','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (29,'钱二','男','1993-01-29','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (30,'钱三','男','1993-01-30','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (31,'钱四','男','1993-02-01','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (32,'钱五','男','1993-02-02','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (33,'钱六','男','1993-02-03','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (34,'钱七','男','1993-02-04','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (35,'钱八','男','1993-02-05','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (36,'钱九','男','1993-02-06','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (37,'吴一','男','1993-02-07','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (38,'吴二','男','1993-02-08','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (39,'吴三','男','1993-02-09','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (40,'吴四','男','1993-02-10','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (41,'吴五','男','1993-02-11','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (42,'吴六','男','1993-02-12','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (43,'吴七','男','1993-02-13','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (44,'吴八','男','1993-02-14','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (45,'吴九','男','1993-02-15','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (46,'柳一','男','1993-02-16','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (47,'柳二','男','1993-02-17','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (48,'柳三','男','1993-02-18','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (49,'柳四','男','1993-02-19','2011-09-01','江苏省南京市雨花台区');
+INSERT INTO student(std_id,std_name,std_sex,std_birth,std_in,std_address) VALUES (50,'柳五','男','1993-02-20','2011-09-01','江苏省南京市雨花台区');
+
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (1,'张一','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (2,'张二','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (3,'张三','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (4,'张四','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (5,'张五','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (6,'张六','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (7,'张七','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (8,'张八','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (9,'张九','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (10,'李一','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (11,'李二','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (12,'李三','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (13,'李四','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (14,'李五','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (15,'李六','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (16,'李七','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (17,'李八','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (18,'李九','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (19,'王一','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (20,'王二','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (21,'王三','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (22,'王四','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (23,'王五','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (24,'王六','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (25,'王七','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (26,'王八','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (27,'王九','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (28,'钱一','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (29,'钱二','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (30,'钱三','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (31,'钱四','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (32,'钱五','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (33,'钱六','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (34,'钱七','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (35,'钱八','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (36,'钱九','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (37,'吴一','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (38,'吴二','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (39,'吴三','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (40,'吴四','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (41,'吴五','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (42,'吴六','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (43,'吴七','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (44,'吴八','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (45,'吴九','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (46,'柳一','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (47,'柳二','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (48,'柳三','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (49,'柳四','讲师','男',35,'2009-07-01');
+INSERT INTO teacher(tec_id,tec_name,tec_job,tec_sex,tec_age,tec_in) VALUES (50,'柳五','讲师','男',35,'2009-07-01');
+
+INSERT INTO class(cla_id,cla_name,cla_teacher) VALUES (1,'计算机',1);
+INSERT INTO class(cla_id,cla_name,cla_teacher) VALUES (2,'自动化',3);
+INSERT INTO class(cla_id,cla_name,cla_teacher) VALUES (3,'飞行器设计',5);
+INSERT INTO class(cla_id,cla_name,cla_teacher) VALUES (4,'大学物理',7);
+INSERT INTO class(cla_id,cla_name,cla_teacher) VALUES (5,'高等数学',9);
+INSERT INTO class(cla_id,cla_name,cla_teacher) VALUES (6,'大学化学',12);
+INSERT INTO class(cla_id,cla_name,cla_teacher) VALUES (7,'表演',14);
+INSERT INTO class(cla_id,cla_name,cla_teacher) VALUES (8,'服装设计',16);
+INSERT INTO class(cla_id,cla_name,cla_teacher) VALUES (9,'工业设计',18);
+INSERT INTO class(cla_id,cla_name,cla_teacher) VALUES (10,'金融学',21);
+INSERT INTO class(cla_id,cla_name,cla_teacher) VALUES (11,'医学',23);
+INSERT INTO class(cla_id,cla_name,cla_teacher) VALUES (12,'土木工程',25);
+INSERT INTO class(cla_id,cla_name,cla_teacher) VALUES (13,'机械',27);
+INSERT INTO class(cla_id,cla_name,cla_teacher) VALUES (14,'建筑学',29);
+INSERT INTO class(cla_id,cla_name,cla_teacher) VALUES (15,'经济学',32);
+INSERT INTO class(cla_id,cla_name,cla_teacher) VALUES (16,'财务管理',34);
+INSERT INTO class(cla_id,cla_name,cla_teacher) VALUES (17,'人力资源',36);
+INSERT INTO class(cla_id,cla_name,cla_teacher) VALUES (18,'力学',38);
+INSERT INTO class(cla_id,cla_name,cla_teacher) VALUES (19,'人工智能',41);
+INSERT INTO class(cla_id,cla_name,cla_teacher) VALUES (20,'会计',45);
+
+INSERT INTO school_department(depart_id,depart_name,depart_teacher) VALUES (1,'计算机学院',2);
+INSERT INTO school_department(depart_id,depart_name,depart_teacher) VALUES (2,'自动化学院',4);
+INSERT INTO school_department(depart_id,depart_name,depart_teacher) VALUES (3,'航空宇航学院',6);
+INSERT INTO school_department(depart_id,depart_name,depart_teacher) VALUES (4,'艺术学院',8);
+INSERT INTO school_department(depart_id,depart_name,depart_teacher) VALUES (5,'理学院',11);
+INSERT INTO school_department(depart_id,depart_name,depart_teacher) VALUES (6,'人工智能学院',13);
+INSERT INTO school_department(depart_id,depart_name,depart_teacher) VALUES (7,'工学院',15);
+INSERT INTO school_department(depart_id,depart_name,depart_teacher) VALUES (8,'管理学院',17);
+INSERT INTO school_department(depart_id,depart_name,depart_teacher) VALUES (9,'农学院',22);
+INSERT INTO school_department(depart_id,depart_name,depart_teacher) VALUES (10,'医学院',28);
+
+INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (1,'数据库系统概论','必修',3);
+INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (2,'艺术设计概论','选修',1);
+INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (3,'力学制图','必修',4);
+INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (4,'飞行器设计历史','选修',1);
+INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (5,'马克思主义','必修',2);
+INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (6,'大学历史','必修',2);
+INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (7,'人力资源管理理论','必修',2.5);
+INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (8,'线性代数','必修',4);
+INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (9,'JAVA程序设计','必修',3);
+INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (10,'操作系统','必修',4);
+INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (11,'计算机组成原理','必修',3);
+INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (12,'自动化设计理论','必修',2);
+INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (13,'情绪表演','必修',2.5);
+INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (14,'茶学历史','选修',1);
+INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (15,'艺术论','必修',1.5);
+INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (16,'机器学习','必修',3);
+INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (17,'数据挖掘','选修',2);
+INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (18,'图像识别','必修',3);
+INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (19,'解剖学','必修',4);
+INSERT INTO course(cor_id,cor_name,cor_type,credit) VALUES (20,'3D max','选修',2);
+
+COMMIT;
\ No newline at end of file
diff --git a/SparkOpOpenGauss/src/main/resources/adult.csv b/SparkOpOpenGauss/src/main/resources/adult.csv
new file mode 100644
index 00000000..2aae7c3d
--- /dev/null
+++ b/SparkOpOpenGauss/src/main/resources/adult.csv
@@ -0,0 +1,102 @@
+age,workclass,fnlwgt,education,education_num,martial_status,occupation,relationship,race,sex,capital_gain,capital_loss,hours_per_week,native_country,salary
+39, State-gov, 77516, Bachelors, 13, Never-married, Adm-clerical, Not-in-family, White, Male, 2174, 0, 40, United-States, <=50K
+50, Self-emp-not-inc, 83311, Bachelors, 13, Married-civ-spouse, Exec-managerial, Husband, White, Male, 0, 0, 13, United-States, <=50K
+38, Private, 215646, HS-grad, 9, Divorced, Handlers-cleaners, Not-in-family, White, Male, 0, 0, 40, United-States, <=50K
+53, Private, 234721, 11th, 7, Married-civ-spouse, Handlers-cleaners, Husband, Black, Male, 0, 0, 40, United-States, <=50K
+28, Private, 338409, Bachelors, 13, Married-civ-spouse, Prof-specialty, Wife, Black, Female, 0, 0, 40, Cuba, <=50K
+37, Private, 284582, Masters, 14, Married-civ-spouse, Exec-managerial, Wife, White, Female, 0, 0, 40, United-States, <=50K
+49, Private, 160187, 9th, 5, Married-spouse-absent, Other-service, Not-in-family, Black, Female, 0, 0, 16, Jamaica, <=50K
+52, Self-emp-not-inc, 209642, HS-grad, 9, Married-civ-spouse, Exec-managerial, Husband, White, Male, 0, 0, 45, United-States, >50K
+31, Private, 45781, Masters, 14, Never-married, Prof-specialty, Not-in-family, White, Female, 14084, 0, 50, United-States, >50K
+42, Private, 159449, Bachelors, 13, Married-civ-spouse, Exec-managerial, Husband, White, Male, 5178, 0, 40, United-States, >50K
+37, Private, 280464, Some-college, 10, Married-civ-spouse, Exec-managerial, Husband, Black, Male, 0, 0, 80, United-States, >50K
+30, State-gov, 141297, Bachelors, 13, Married-civ-spouse, Prof-specialty, Husband, Asian-Pac-Islander, Male, 0, 0, 40, India, >50K
+23, Private, 122272, Bachelors, 13, Never-married, Adm-clerical, Own-child, White, Female, 0, 0, 30, United-States, <=50K
+32, Private, 205019, Assoc-acdm, 12, Never-married, Sales, Not-in-family, Black, Male, 0, 0, 50, United-States, <=50K
+40, Private, 121772, Assoc-voc, 11, Married-civ-spouse, Craft-repair, Husband, Asian-Pac-Islander, Male, 0, 0, 40, ?, >50K
+34, Private, 245487, 7th-8th, 4, Married-civ-spouse, Transport-moving, Husband, Amer-Indian-Eskimo, Male, 0, 0, 45, Mexico, <=50K
+25, Self-emp-not-inc, 176756, HS-grad, 9, Never-married, Farming-fishing, Own-child, White, Male, 0, 0, 35, United-States, <=50K
+32, Private, 186824, HS-grad, 9, Never-married, Machine-op-inspct, Unmarried, White, Male, 0, 0, 40, United-States, <=50K
+38, Private, 28887, 11th, 7, Married-civ-spouse, Sales, Husband, White, Male, 0, 0, 50, United-States, <=50K
+43, Self-emp-not-inc, 292175, Masters, 14, Divorced, Exec-managerial, Unmarried, White, Female, 0, 0, 45, United-States, >50K
+40, Private, 193524, Doctorate, 16, Married-civ-spouse, Prof-specialty, Husband, White, Male, 0, 0, 60, United-States, >50K
+54, Private, 302146, HS-grad, 9, Separated, Other-service, Unmarried, Black, Female, 0, 0, 20, United-States, <=50K
+35, Federal-gov, 76845, 9th, 5, Married-civ-spouse, Farming-fishing, Husband, Black, Male, 0, 0, 40, United-States, <=50K
+43, Private, 117037, 11th, 7, Married-civ-spouse, Transport-moving, Husband, White, Male, 0, 2042, 40, United-States, <=50K
+59, Private, 109015, HS-grad, 9, Divorced, Tech-support, Unmarried, White, Female, 0, 0, 40, United-States, <=50K
+56, Local-gov, 216851, Bachelors, 13, Married-civ-spouse, Tech-support, Husband, White, Male, 0, 0, 40, United-States, >50K
+19, Private, 168294, HS-grad, 9, Never-married, Craft-repair, Own-child, White, Male, 0, 0, 40, United-States, <=50K
+54, ?, 180211, Some-college, 10, Married-civ-spouse, ?, Husband, Asian-Pac-Islander, Male, 0, 0, 60, South, >50K
+39, Private, 367260, HS-grad, 9, Divorced, Exec-managerial, Not-in-family, White, Male, 0, 0, 80, United-States, <=50K
+49, Private, 193366, HS-grad, 9, Married-civ-spouse, Craft-repair, Husband, White, Male, 0, 0, 40, United-States, <=50K
+23, Local-gov, 190709, Assoc-acdm, 12, Never-married, Protective-serv, Not-in-family, White, Male, 0, 0, 52, United-States, <=50K
+20, Private, 266015, Some-college, 10, Never-married, Sales, Own-child, Black, Male, 0, 0, 44, United-States, <=50K
+45, Private, 386940, Bachelors, 13, Divorced, Exec-managerial, Own-child, White, Male, 0, 1408, 40, United-States, <=50K
+30, Federal-gov, 59951, Some-college, 10, Married-civ-spouse, Adm-clerical, Own-child, White, Male, 0, 0, 40, United-States, <=50K
+22, State-gov, 311512, Some-college, 10, Married-civ-spouse, Other-service, Husband, Black, Male, 0, 0, 15, United-States, <=50K
+48, Private, 242406, 11th, 7, Never-married, Machine-op-inspct, Unmarried, White, Male, 0, 0, 40, Puerto-Rico, <=50K
+21, Private, 197200, Some-college, 10, Never-married, Machine-op-inspct, Own-child, White, Male, 0, 0, 40, United-States, <=50K
+19, Private, 544091, HS-grad, 9, Married-AF-spouse, Adm-clerical, Wife, White, Female, 0, 0, 25, United-States, <=50K
+31, Private, 84154, Some-college, 10, Married-civ-spouse, Sales, Husband, White, Male, 0, 0, 38, ?, >50K
+48, Self-emp-not-inc, 265477, Assoc-acdm, 12, Married-civ-spouse, Prof-specialty, Husband, White, Male, 0, 0, 40, United-States, <=50K
+31, Private, 507875, 9th, 5, Married-civ-spouse, Machine-op-inspct, Husband, White, Male, 0, 0, 43, United-States, <=50K
+53, Self-emp-not-inc, 88506, Bachelors, 13, Married-civ-spouse, Prof-specialty, Husband, White, Male, 0, 0, 40, United-States, <=50K
+24, Private, 172987, Bachelors, 13, Married-civ-spouse, Tech-support, Husband, White, Male, 0, 0, 50, United-States, <=50K
+49, Private, 94638, HS-grad, 9, Separated, Adm-clerical, Unmarried, White, Female, 0, 0, 40, United-States, <=50K
+25, Private, 289980, HS-grad, 9, Never-married, Handlers-cleaners, Not-in-family, White, Male, 0, 0, 35, United-States, <=50K
+57, Federal-gov, 337895, Bachelors, 13, Married-civ-spouse, Prof-specialty, Husband, Black, Male, 0, 0, 40, United-States, >50K
+53, Private, 144361, HS-grad, 9, Married-civ-spouse, Machine-op-inspct, Husband, White, Male, 0, 0, 38, United-States, <=50K
+44, Private, 128354, Masters, 14, Divorced, Exec-managerial, Unmarried, White, Female, 0, 0, 40, United-States, <=50K
+41, State-gov, 101603, Assoc-voc, 11, Married-civ-spouse, Craft-repair, Husband, White, Male, 0, 0, 40, United-States, <=50K
+29, Private, 271466, Assoc-voc, 11, Never-married, Prof-specialty, Not-in-family, White, Male, 0, 0, 43, United-States, <=50K
+25, Private, 32275, Some-college, 10, Married-civ-spouse, Exec-managerial, Wife, Other, Female, 0, 0, 40, United-States, <=50K
+18, Private, 226956, HS-grad, 9, Never-married, Other-service, Own-child, White, Female, 0, 0, 30, ?, <=50K
+47, Private, 51835, Prof-school, 15, Married-civ-spouse, Prof-specialty, Wife, White, Female, 0, 1902, 60, Honduras, >50K
+50, Federal-gov, 251585, Bachelors, 13, Divorced, Exec-managerial, Not-in-family, White, Male, 0, 0, 55, United-States, >50K
+47, Self-emp-inc, 109832, HS-grad, 9, Divorced, Exec-managerial, Not-in-family, White, Male, 0, 0, 60, United-States, <=50K
+43, Private, 237993, Some-college, 10, Married-civ-spouse, Tech-support, Husband, White, Male, 0, 0, 40, United-States, >50K
+46, Private, 216666, 5th-6th, 3, Married-civ-spouse, Machine-op-inspct, Husband, White, Male, 0, 0, 40, Mexico, <=50K
+35, Private, 56352, Assoc-voc, 11, Married-civ-spouse, Other-service, Husband, White, Male, 0, 0, 40, Puerto-Rico, <=50K
+41, Private, 147372, HS-grad, 9, Married-civ-spouse, Adm-clerical, Husband, White, Male, 0, 0, 48, United-States, <=50K
+30, Private, 188146, HS-grad, 9, Married-civ-spouse, Machine-op-inspct, Husband, White, Male, 5013, 0, 40, United-States, <=50K
+30, Private, 59496, Bachelors, 13, Married-civ-spouse, Sales, Husband, White, Male, 2407, 0, 40, United-States, <=50K
+32, ?, 293936, 7th-8th, 4, Married-spouse-absent, ?, Not-in-family, White, Male, 0, 0, 40, ?, <=50K
+48, Private, 149640, HS-grad, 9, Married-civ-spouse, Transport-moving, Husband, White, Male, 0, 0, 40, United-States, <=50K
+42, Private, 116632, Doctorate, 16, Married-civ-spouse, Prof-specialty, Husband, White, Male, 0, 0, 45, United-States, >50K
+29, Private, 105598, Some-college, 10, Divorced, Tech-support, Not-in-family, White, Male, 0, 0, 58, United-States, <=50K
+36, Private, 155537, HS-grad, 9, Married-civ-spouse, Craft-repair, Husband, White, Male, 0, 0, 40, United-States, <=50K
+28, Private, 183175, Some-college, 10, Divorced, Adm-clerical, Not-in-family, White, Female, 0, 0, 40, United-States, <=50K
+53, Private, 169846, HS-grad, 9, Married-civ-spouse, Adm-clerical, Wife, White, Female, 0, 0, 40, United-States, >50K
+49, Self-emp-inc, 191681, Some-college, 10, Married-civ-spouse, Exec-managerial, Husband, White, Male, 0, 0, 50, United-States, >50K
+25, ?, 200681, Some-college, 10, Never-married, ?, Own-child, White, Male, 0, 0, 40, United-States, <=50K
+19, Private, 101509, Some-college, 10, Never-married, Prof-specialty, Own-child, White, Male, 0, 0, 32, United-States, <=50K
+31, Private, 309974, Bachelors, 13, Separated, Sales, Own-child, Black, Female, 0, 0, 40, United-States, <=50K
+29, Self-emp-not-inc, 162298, Bachelors, 13, Married-civ-spouse, Sales, Husband, White, Male, 0, 0, 70, United-States, >50K
+23, Private, 211678, Some-college, 10, Never-married, Machine-op-inspct, Not-in-family, White, Male, 0, 0, 40, United-States, <=50K
+79, Private, 124744, Some-college, 10, Married-civ-spouse, Prof-specialty, Other-relative, White, Male, 0, 0, 20, United-States, <=50K
+27, Private, 213921, HS-grad, 9, Never-married, Other-service, Own-child, White, Male, 0, 0, 40, Mexico, <=50K
+40, Private, 32214, Assoc-acdm, 12, Married-civ-spouse, Adm-clerical, Husband, White, Male, 0, 0, 40, United-States, <=50K
+67, ?, 212759, 10th, 6, Married-civ-spouse, ?, Husband, White, Male, 0, 0, 2, United-States, <=50K
+18, Private, 309634, 11th, 7, Never-married, Other-service, Own-child, White, Female, 0, 0, 22, United-States, <=50K
+31, Local-gov, 125927, 7th-8th, 4, Married-civ-spouse, Farming-fishing, Husband, White, Male, 0, 0, 40, United-States, <=50K
+18, Private, 446839, HS-grad, 9, Never-married, Sales, Not-in-family, White, Male, 0, 0, 30, United-States, <=50K
+52, Private, 276515, Bachelors, 13, Married-civ-spouse, Other-service, Husband, White, Male, 0, 0, 40, Cuba, <=50K
+46, Private, 51618, HS-grad, 9, Married-civ-spouse, Other-service, Wife, White, Female, 0, 0, 40, United-States, <=50K
+59, Private, 159937, HS-grad, 9, Married-civ-spouse, Sales, Husband, White, Male, 0, 0, 48, United-States, <=50K
+44, Private, 343591, HS-grad, 9, Divorced, Craft-repair, Not-in-family, White, Female, 14344, 0, 40, United-States, >50K
+53, Private, 346253, HS-grad, 9, Divorced, Sales, Own-child, White, Female, 0, 0, 35, United-States, <=50K
+49, Local-gov, 268234, HS-grad, 9, Married-civ-spouse, Protective-serv, Husband, White, Male, 0, 0, 40, United-States, >50K
+33, Private, 202051, Masters, 14, Married-civ-spouse, Prof-specialty, Husband, White, Male, 0, 0, 50, United-States, <=50K
+30, Private, 54334, 9th, 5, Never-married, Sales, Not-in-family, White, Male, 0, 0, 40, United-States, <=50K
+43, Federal-gov, 410867, Doctorate, 16, Never-married, Prof-specialty, Not-in-family, White, Female, 0, 0, 50, United-States, >50K
+57, Private, 249977, Assoc-voc, 11, Married-civ-spouse, Prof-specialty, Husband, White, Male, 0, 0, 40, United-States, <=50K
+37, Private, 286730, Some-college, 10, Divorced, Craft-repair, Unmarried, White, Female, 0, 0, 40, United-States, <=50K
+28, Private, 212563, Some-college, 10, Divorced, Machine-op-inspct, Unmarried, Black, Female, 0, 0, 25, United-States, <=50K
+30, Private, 117747, HS-grad, 9, Married-civ-spouse, Sales, Wife, Asian-Pac-Islander, Female, 0, 1573, 35, ?, <=50K
+34, Local-gov, 226296, Bachelors, 13, Married-civ-spouse, Protective-serv, Husband, White, Male, 0, 0, 40, United-States, >50K
+29, Local-gov, 115585, Some-college, 10, Never-married, Handlers-cleaners, Not-in-family, White, Male, 0, 0, 50, United-States, <=50K
+48, Self-emp-not-inc, 191277, Doctorate, 16, Married-civ-spouse, Prof-specialty, Husband, White, Male, 0, 1902, 60, United-States, >50K
+37, Private, 202683, Some-college, 10, Married-civ-spouse, Sales, Husband, White, Male, 0, 0, 48, United-States, >50K
+48, Private, 171095, Assoc-acdm, 12, Divorced, Exec-managerial, Unmarried, White, Female, 0, 0, 40, England, <=50K
+32, Federal-gov, 249409, HS-grad, 9, Never-married, Other-service, Own-child, Black, Male, 0, 0, 40, United-States, <=50K
+76, Private, 124191, Masters, 14, Married-civ-spouse, Exec-managerial, Husband, White, Male, 0, 0, 40, United-States, >50K
diff --git a/SparkOpOpenGauss/src/main/resources/customers.csv b/SparkOpOpenGauss/src/main/resources/customers.csv
new file mode 100644
index 00000000..0b4f8528
--- /dev/null
+++ b/SparkOpOpenGauss/src/main/resources/customers.csv
@@ -0,0 +1,5 @@
+customerId,customerName
+1,John
+2,Clerk
+3,Micheal
+4,Sample
diff --git a/SparkOpOpenGauss/src/main/resources/metrics.properties b/SparkOpOpenGauss/src/main/resources/metrics.properties
new file mode 100644
index 00000000..a882870e
--- /dev/null
+++ b/SparkOpOpenGauss/src/main/resources/metrics.properties
@@ -0,0 +1 @@
+*.sink.console.class=org.apache.spark.metrics.sink.ConsoleSink
\ No newline at end of file
diff --git a/SparkOpOpenGauss/src/main/resources/multicharacterseperator.csv b/SparkOpOpenGauss/src/main/resources/multicharacterseperator.csv
new file mode 100644
index 00000000..9db32e5b
--- /dev/null
+++ b/SparkOpOpenGauss/src/main/resources/multicharacterseperator.csv
@@ -0,0 +1,3 @@
+a||b||c||d
+1||2||3||4
+5||6||7||8
\ No newline at end of file
diff --git a/SparkOpOpenGauss/src/main/resources/nested/a.csv b/SparkOpOpenGauss/src/main/resources/nested/a.csv
new file mode 100644
index 00000000..9db32e5b
--- /dev/null
+++ b/SparkOpOpenGauss/src/main/resources/nested/a.csv
@@ -0,0 +1,3 @@
+a||b||c||d
+1||2||3||4
+5||6||7||8
\ No newline at end of file
diff --git a/SparkOpOpenGauss/src/main/resources/nested/folder1/b.csv b/SparkOpOpenGauss/src/main/resources/nested/folder1/b.csv
new file mode 100644
index 00000000..9db32e5b
--- /dev/null
+++ b/SparkOpOpenGauss/src/main/resources/nested/folder1/b.csv
@@ -0,0 +1,3 @@
+a||b||c||d
+1||2||3||4
+5||6||7||8
\ No newline at end of file
diff --git a/SparkOpOpenGauss/src/main/resources/sales.csv b/SparkOpOpenGauss/src/main/resources/sales.csv
new file mode 100644
index 00000000..b3145638
--- /dev/null
+++ b/SparkOpOpenGauss/src/main/resources/sales.csv
@@ -0,0 +1,15 @@
+transactionId,customerId,itemId,amountPaid
+111,1,1,100.0
+112,2,2,505.0
+113,3,3,510.0
+114,4,4,600.0
+115,1,2,500.0
+116,1,2,500.0
+117,1,2,500.0
+118,1,2,500.0
+119,2,3,500.0
+120,1,2,500.0
+121,1,4,500.0
+122,1,2,500.0
+123,1,4,500.0
+124,1,2,500.0
\ No newline at end of file
diff --git a/SparkOpOpenGauss/src/main/scala/SQLDataSourceExample.scala b/SparkOpOpenGauss/src/main/scala/SQLDataSourceExample.scala
new file mode 100644
index 00000000..440851c3
--- /dev/null
+++ b/SparkOpOpenGauss/src/main/scala/SQLDataSourceExample.scala
@@ -0,0 +1,400 @@
+package org.apache.spark.examples.sql
+
+import java.util.Properties
+
+import org.apache.spark.sql.SparkSession
+
+object SQLDataSourceExample {
+
+ case class Person(name: String, age: Long)
+
+ def main(args: Array[String]): Unit = {
+ val spark = SparkSession
+ .builder()
+ .master("local")
+ .appName("Spark SQL data sources example")
+ .config("spark.some.config.option", "some-value")
+ .getOrCreate()
+
+ // runBasicDataSourceExample(spark)
+ // runGenericFileSourceOptionsExample(spark)
+ // runBasicParquetExample(spark)
+ // runParquetSchemaMergingExample(spark)
+ // runJsonDatasetExample(spark)
+ // runCsvDatasetExample(spark)
+ // runTextDatasetExample(spark)
+ runJdbcDatasetExample(spark)
+
+ spark.stop()
+ }
+
+ private def runGenericFileSourceOptionsExample(spark: SparkSession): Unit = {
+ // $example on:ignore_corrupt_files$
+ // enable ignore corrupt files
+ spark.sql("set spark.sql.files.ignoreCorruptFiles=true")
+ // dir1/file3.json is corrupt from parquet's view
+ val testCorruptDF = spark.read.parquet(
+ "examples/src/main/resources/dir1/",
+ "examples/src/main/resources/dir1/dir2/")
+ testCorruptDF.show()
+ // +-------------+
+ // | file|
+ // +-------------+
+ // |file1.parquet|
+ // |file2.parquet|
+ // +-------------+
+ // $example off:ignore_corrupt_files$
+ // $example on:recursive_file_lookup$
+ val recursiveLoadedDF = spark.read.format("parquet")
+ .option("recursiveFileLookup", "true")
+ .load("examples/src/main/resources/dir1")
+ recursiveLoadedDF.show()
+ // +-------------+
+ // | file|
+ // +-------------+
+ // |file1.parquet|
+ // |file2.parquet|
+ // +-------------+
+ // $example off:recursive_file_lookup$
+ spark.sql("set spark.sql.files.ignoreCorruptFiles=false")
+ // $example on:load_with_path_glob_filter$
+ val testGlobFilterDF = spark.read.format("parquet")
+ .option("pathGlobFilter", "*.parquet") // json file should be filtered out
+ .load("examples/src/main/resources/dir1")
+ testGlobFilterDF.show()
+ // +-------------+
+ // | file|
+ // +-------------+
+ // |file1.parquet|
+ // +-------------+
+ // $example off:load_with_path_glob_filter$
+ // $example on:load_with_modified_time_filter$
+ val beforeFilterDF = spark.read.format("parquet")
+ // Files modified before 07/01/2020 at 05:30 are allowed
+ .option("modifiedBefore", "2020-07-01T05:30:00")
+ .load("examples/src/main/resources/dir1");
+ beforeFilterDF.show();
+ // +-------------+
+ // | file|
+ // +-------------+
+ // |file1.parquet|
+ // +-------------+
+ val afterFilterDF = spark.read.format("parquet")
+ // Files modified after 06/01/2020 at 05:30 are allowed
+ .option("modifiedAfter", "2020-06-01T05:30:00")
+ .load("examples/src/main/resources/dir1");
+ afterFilterDF.show();
+ // +-------------+
+ // | file|
+ // +-------------+
+ // +-------------+
+ // $example off:load_with_modified_time_filter$
+ }
+
+ private def runBasicDataSourceExample(spark: SparkSession): Unit = {
+ // $example on:generic_load_save_functions$
+ val usersDF = spark.read.load("examples/src/main/resources/users.parquet")
+ usersDF.select("name", "favorite_color").write.save("namesAndFavColors.parquet")
+ // $example off:generic_load_save_functions$
+ // $example on:manual_load_options$
+ val peopleDF = spark.read.format("json").load("examples/src/main/resources/people.json")
+ peopleDF.select("name", "age").write.format("parquet").save("namesAndAges.parquet")
+ // $example off:manual_load_options$
+ // $example on:manual_load_options_csv$
+ val peopleDFCsv = spark.read.format("csv")
+ .option("sep", ";")
+ .option("inferSchema", "true")
+ .option("header", "true")
+ .load("examples/src/main/resources/people.csv")
+ // $example off:manual_load_options_csv$
+ // $example on:manual_save_options_orc$
+ usersDF.write.format("orc")
+ .option("orc.bloom.filter.columns", "favorite_color")
+ .option("orc.dictionary.key.threshold", "1.0")
+ .option("orc.column.encoding.direct", "name")
+ .save("users_with_options.orc")
+ // $example off:manual_save_options_orc$
+ // $example on:manual_save_options_parquet$
+ usersDF.write.format("parquet")
+ .option("parquet.bloom.filter.enabled#favorite_color", "true")
+ .option("parquet.bloom.filter.expected.ndv#favorite_color", "1000000")
+ .option("parquet.enable.dictionary", "true")
+ .option("parquet.page.write-checksum.enabled", "false")
+ .save("users_with_options.parquet")
+ // $example off:manual_save_options_parquet$
+
+ // $example on:direct_sql$
+ val sqlDF = spark.sql("SELECT * FROM parquet.`examples/src/main/resources/users.parquet`")
+ // $example off:direct_sql$
+ // $example on:write_sorting_and_bucketing$
+ peopleDF.write.bucketBy(42, "name").sortBy("age").saveAsTable("people_bucketed")
+ // $example off:write_sorting_and_bucketing$
+ // $example on:write_partitioning$
+ usersDF.write.partitionBy("favorite_color").format("parquet").save("namesPartByColor.parquet")
+ // $example off:write_partitioning$
+ // $example on:write_partition_and_bucket$
+ usersDF
+ .write
+ .partitionBy("favorite_color")
+ .bucketBy(42, "name")
+ .saveAsTable("users_partitioned_bucketed")
+ // $example off:write_partition_and_bucket$
+
+ spark.sql("DROP TABLE IF EXISTS people_bucketed")
+ spark.sql("DROP TABLE IF EXISTS users_partitioned_bucketed")
+ }
+
+ private def runBasicParquetExample(spark: SparkSession): Unit = {
+ // $example on:basic_parquet_example$
+ // Encoders for most common types are automatically provided by importing spark.implicits._
+ import spark.implicits._
+
+ val peopleDF = spark.read.json("examples/src/main/resources/people.json")
+
+ // DataFrames can be saved as Parquet files, maintaining the schema information
+ peopleDF.write.parquet("people.parquet")
+
+ // Read in the parquet file created above
+ // Parquet files are self-describing so the schema is preserved
+ // The result of loading a Parquet file is also a DataFrame
+ val parquetFileDF = spark.read.parquet("people.parquet")
+
+ // Parquet files can also be used to create a temporary view and then used in SQL statements
+ parquetFileDF.createOrReplaceTempView("parquetFile")
+ val namesDF = spark.sql("SELECT name FROM parquetFile WHERE age BETWEEN 13 AND 19")
+ namesDF.map(attributes => "Name: " + attributes(0)).show()
+ // +------------+
+ // | value|
+ // +------------+
+ // |Name: Justin|
+ // +------------+
+ // $example off:basic_parquet_example$
+ }
+
+ private def runParquetSchemaMergingExample(spark: SparkSession): Unit = {
+ // $example on:schema_merging$
+ // This is used to implicitly convert an RDD to a DataFrame.
+ import spark.implicits._
+
+ // Create a simple DataFrame, store into a partition directory
+ val squaresDF = spark.sparkContext.makeRDD(1 to 5).map(i => (i, i * i)).toDF("value", "square")
+ squaresDF.write.parquet("data/test_table/key=1")
+
+ // Create another DataFrame in a new partition directory,
+ // adding a new column and dropping an existing column
+ val cubesDF = spark.sparkContext.makeRDD(6 to 10).map(i => (i, i * i * i)).toDF("value", "cube")
+ cubesDF.write.parquet("data/test_table/key=2")
+
+ // Read the partitioned table
+ val mergedDF = spark.read.option("mergeSchema", "true").parquet("data/test_table")
+ mergedDF.printSchema()
+
+ // The final schema consists of all 3 columns in the Parquet files together
+ // with the partitioning column appeared in the partition directory paths
+ // root
+ // |-- value: int (nullable = true)
+ // |-- square: int (nullable = true)
+ // |-- cube: int (nullable = true)
+ // |-- key: int (nullable = true)
+ // $example off:schema_merging$
+ }
+
+ private def runJsonDatasetExample(spark: SparkSession): Unit = {
+ // $example on:json_dataset$
+ // Primitive types (Int, String, etc) and Product types (case classes) encoders are
+ // supported by importing this when creating a Dataset.
+ import spark.implicits._
+
+ // A JSON dataset is pointed to by path.
+ // The path can be either a single text file or a directory storing text files
+ val path = "examples/src/main/resources/people.json"
+ val peopleDF = spark.read.json(path)
+
+ // The inferred schema can be visualized using the printSchema() method
+ peopleDF.printSchema()
+ // root
+ // |-- age: long (nullable = true)
+ // |-- name: string (nullable = true)
+
+ // Creates a temporary view using the DataFrame
+ peopleDF.createOrReplaceTempView("people")
+
+ // SQL statements can be run by using the sql methods provided by spark
+ val teenagerNamesDF = spark.sql("SELECT name FROM people WHERE age BETWEEN 13 AND 19")
+ teenagerNamesDF.show()
+ // +------+
+ // | name|
+ // +------+
+ // |Justin|
+ // +------+
+
+ // Alternatively, a DataFrame can be created for a JSON dataset represented by
+ // a Dataset[String] storing one JSON object per string
+ val otherPeopleDataset = spark.createDataset(
+ """{"name":"Yin","address":{"city":"Columbus","state":"Ohio"}}""" :: Nil)
+ val otherPeople = spark.read.json(otherPeopleDataset)
+ otherPeople.show()
+ // +---------------+----+
+ // | address|name|
+ // +---------------+----+
+ // |[Columbus,Ohio]| Yin|
+ // +---------------+----+
+ // $example off:json_dataset$
+ }
+
+ private def runCsvDatasetExample(spark: SparkSession): Unit = {
+ // $example on:csv_dataset$
+ // A CSV dataset is pointed to by path.
+ // The path can be either a single CSV file or a directory of CSV files
+ val path = "examples/src/main/resources/people.csv"
+
+ val df = spark.read.csv(path)
+ df.show()
+ // +------------------+
+ // | _c0|
+ // +------------------+
+ // | name;age;job|
+ // |Jorge;30;Developer|
+ // | Bob;32;Developer|
+ // +------------------+
+
+ // Read a csv with delimiter, the default delimiter is ","
+ val df2 = spark.read.option("delimiter", ";").csv(path)
+ df2.show()
+ // +-----+---+---------+
+ // | _c0|_c1| _c2|
+ // +-----+---+---------+
+ // | name|age| job|
+ // |Jorge| 30|Developer|
+ // | Bob| 32|Developer|
+ // +-----+---+---------+
+
+ // Read a csv with delimiter and a header
+ val df3 = spark.read.option("delimiter", ";").option("header", "true").csv(path)
+ df3.show()
+ // +-----+---+---------+
+ // | name|age| job|
+ // +-----+---+---------+
+ // |Jorge| 30|Developer|
+ // | Bob| 32|Developer|
+ // +-----+---+---------+
+
+ // You can also use options() to use multiple options
+ val df4 = spark.read.options(Map("delimiter" -> ";", "header" -> "true")).csv(path)
+
+ // "output" is a folder which contains multiple csv files and a _SUCCESS file.
+ df3.write.csv("output")
+
+ // Read all files in a folder, please make sure only CSV files should present in the folder.
+ val folderPath = "examples/src/main/resources";
+ val df5 = spark.read.csv(folderPath);
+ df5.show();
+ // Wrong schema because non-CSV files are read
+ // +-----------+
+ // | _c0|
+ // +-----------+
+ // |238val_238|
+ // | 86val_86|
+ // |311val_311|
+ // | 27val_27|
+ // |165val_165|
+ // +-----------+
+
+ // $example off:csv_dataset$
+ }
+
+ private def runTextDatasetExample(spark: SparkSession): Unit = {
+ // $example on:text_dataset$
+ // A text dataset is pointed to by path.
+ // The path can be either a single text file or a directory of text files
+ val path = "examples/src/main/resources/people.txt"
+
+ val df1 = spark.read.text(path)
+ df1.show()
+ // +-----------+
+ // | value|
+ // +-----------+
+ // |Michael, 29|
+ // | Andy, 30|
+ // | Justin, 19|
+ // +-----------+
+
+ // You can use 'lineSep' option to define the line separator.
+ // The line separator handles all `\r`, `\r\n` and `\n` by default.
+ val df2 = spark.read.option("lineSep", ",").text(path)
+ df2.show()
+ // +-----------+
+ // | value|
+ // +-----------+
+ // | Michael|
+ // | 29\nAndy|
+ // | 30\nJustin|
+ // | 19\n|
+ // +-----------+
+
+ // You can also use 'wholetext' option to read each input file as a single row.
+ val df3 = spark.read.option("wholetext", true).text(path)
+ df3.show()
+ // +--------------------+
+ // | value|
+ // +--------------------+
+ // |Michael, 29\nAndy...|
+ // +--------------------+
+
+ // "output" is a folder which contains multiple text files and a _SUCCESS file.
+ df1.write.text("output")
+
+ // You can specify the compression format using the 'compression' option.
+ df1.write.option("compression", "gzip").text("output_compressed")
+
+ // $example off:text_dataset$
+ }
+
+ private def runJdbcDatasetExample(spark: SparkSession): Unit = {
+ // $example on:jdbc_dataset$
+ // Note: JDBC loading and saving can be achieved via either the load/save or jdbc methods
+ // Loading data from a JDBC source
+ val jdbcDF = spark.read
+ .format("jdbc")
+ .option("url", "jdbc:postgresql://x.x.x.x:port/school")
+ .option("dbtable", "class")
+ .option("user", "sparkuser")
+ .option("password", "Enmo@123")
+ .load()
+ //.show()
+
+ val connectionProperties = new Properties()
+ connectionProperties.put("user", "sparkuser")
+ connectionProperties.put("password", "Enmo@123")
+ val jdbcDF2 = spark.read
+ .option("customSchema","cla_id INT")
+ .jdbc("jdbc:postgresql://x.x.x.x:port/school", "class", connectionProperties).show()
+ // Specifying the custom data types of the read schema
+
+
+ connectionProperties.put("customSchema", "cla_id INT")//, cla_name STRING")
+ val jdbcDF3 = spark.read
+ .jdbc("jdbc:postgresql://x.x.x.x:port/school", "class", connectionProperties)
+
+// // Saving data to a JDBC source. Create table "customtable1", and write data
+// jdbcDF.write
+// .format("jdbc")
+// .option("url", "jdbc:postgresql://x.x.x.x:port/school")
+// .option("dbtable", "customtable1")
+// .option("user", "sparkuser")
+// .option("password", "Enmo@123")
+// .save()
+//
+//
+// jdbcDF2.write
+// .jdbc("jdbc:postgresql://x.x.x.x:port/school", "customtable2", connectionProperties)
+
+ // Specifying create table column data types on write
+ jdbcDF3.show()
+
+// jdbcDF3.write
+// .option("createTableColumnTypes", "cla_id INT, cla_name VARCHAR(20)")
+// .jdbc("jdbc:postgresql://x.x.x.x:port/school", "customtable3", connectionProperties)
+// // $example off:jdbc_dataset$
+ }
+}
\ No newline at end of file
diff --git a/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/datasourcev2/multi/SimpleMultiDataSource.scala b/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/datasourcev2/multi/SimpleMultiDataSource.scala
new file mode 100644
index 00000000..a1c2a89e
--- /dev/null
+++ b/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/datasourcev2/multi/SimpleMultiDataSource.scala
@@ -0,0 +1,102 @@
+package org.opengauss.spark.sources.datasourcev2.multi
+
+import java.util
+
+import org.apache.spark.sql.catalyst.InternalRow
+import org.apache.spark.sql.connector.catalog.{SupportsRead, Table, TableCapability, TableProvider}
+import org.apache.spark.sql.connector.expressions.Transform
+import org.apache.spark.sql.connector.read._
+import org.apache.spark.sql.types.{StringType, StructField, StructType}
+import org.apache.spark.sql.util.CaseInsensitiveStringMap
+import org.apache.spark.unsafe.types.UTF8String
+
+import scala.collection.JavaConverters._
+
+/*
+ * Default source should some kind of relation provider
+ */
+class DefaultSource extends TableProvider{
+
+ override def inferSchema(caseInsensitiveStringMap: CaseInsensitiveStringMap): StructType =
+ getTable(null,Array.empty[Transform],caseInsensitiveStringMap.asCaseSensitiveMap()).schema()
+
+ override def getTable(structType: StructType, transforms: Array[Transform], map: util.Map[String, String]): Table =
+ new SimpleBatchTable()
+
+}
+
+
+/*
+ Defines Read Support and Initial Schema
+ */
+
+class SimpleBatchTable extends Table with SupportsRead {
+ override def name(): String = this.getClass.toString
+
+ override def schema(): StructType = StructType(Array(StructField("value", StringType)))
+
+ override def capabilities(): util.Set[TableCapability] = Set(TableCapability.BATCH_READ).asJava
+
+ override def newScanBuilder(options: CaseInsensitiveStringMap): ScanBuilder = new SimpleScanBuilder()
+}
+
+
+/*
+ Scan object with no mixins
+ */
+class SimpleScanBuilder extends ScanBuilder {
+ override def build(): Scan = new SimpleScan
+}
+
+/*
+ Batch Reading Support
+
+ The schema is repeated here as it can change after column pruning etc
+ */
+
+class SimpleScan extends Scan with Batch{
+ override def readSchema(): StructType = StructType(Array(StructField("value", StringType)))
+
+ override def toBatch: Batch = this
+
+ override def planInputPartitions(): Array[InputPartition] = {
+ Array(new SimplePartition(0,4),
+ new SimplePartition(5,9))
+ }
+ override def createReaderFactory(): PartitionReaderFactory = new SimplePartitionReaderFactory()
+}
+
+// simple class to organise the partition
+class SimplePartition(val start:Int, val end:Int) extends InputPartition
+
+// reader factory
+class SimplePartitionReaderFactory extends PartitionReaderFactory {
+ override def createReader(partition: InputPartition): PartitionReader[InternalRow] = new
+ SimplePartitionReader(partition.asInstanceOf[SimplePartition])
+}
+
+
+// parathion reader
+class SimplePartitionReader(inputPartition: SimplePartition) extends PartitionReader[InternalRow] {
+
+ val values = Array("1", "2", "3", "4", "5","6","7","8","9","10")
+
+ var index = inputPartition.start
+
+ def next = index <= inputPartition.end
+
+ def get = {
+ val stringValue = values(index)
+ val stringUtf = UTF8String.fromString(stringValue)
+ val row = InternalRow(stringUtf)
+ index = index + 1
+ row
+ }
+
+ def close() = Unit
+
+}
+
+
+
+
diff --git a/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/datasourcev2/simple/SimpleDataSource.scala b/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/datasourcev2/simple/SimpleDataSource.scala
new file mode 100644
index 00000000..0b8e0816
--- /dev/null
+++ b/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/datasourcev2/simple/SimpleDataSource.scala
@@ -0,0 +1,100 @@
+package org.opengauss.spark.sources.datasourcev2.simple
+
+import java.util
+
+import org.apache.spark.sql.catalyst.InternalRow
+import org.apache.spark.sql.connector.catalog.{SupportsRead, Table, TableCapability, TableProvider}
+import org.apache.spark.sql.connector.expressions.Transform
+import org.apache.spark.sql.connector.read._
+import org.apache.spark.sql.types.{StringType, StructField, StructType}
+import org.apache.spark.sql.util.CaseInsensitiveStringMap
+import org.apache.spark.unsafe.types.UTF8String
+
+import scala.collection.JavaConverters._
+
+/*
+ * Default source should some kind of relation provider
+ */
+class DefaultSource extends TableProvider{
+
+ override def inferSchema(caseInsensitiveStringMap: CaseInsensitiveStringMap): StructType =
+ getTable(null,Array.empty[Transform],caseInsensitiveStringMap.asCaseSensitiveMap()).schema()
+
+ override def getTable(structType: StructType, transforms: Array[Transform], map: util.Map[String, String]): Table =
+ new SimpleBatchTable()
+}
+
+
+/*
+ Defines Read Support and Initial Schema
+ */
+
+class SimpleBatchTable extends Table with SupportsRead {
+ override def name(): String = this.getClass.toString
+
+ override def schema(): StructType = StructType(Array(StructField("value", StringType)))
+
+ override def capabilities(): util.Set[TableCapability] = Set(TableCapability.BATCH_READ).asJava
+
+ override def newScanBuilder(options: CaseInsensitiveStringMap): ScanBuilder = new SimpleScanBuilder()
+}
+
+
+
+/*
+ Scan object with no mixins
+ */
+class SimpleScanBuilder extends ScanBuilder {
+ override def build(): Scan = new SimpleScan
+}
+
+/*
+ Batch Reading Support
+
+ The schema is repeated here as it can change after column pruning etc
+ */
+
+class SimpleScan extends Scan with Batch{
+ override def readSchema(): StructType = StructType(Array(StructField("value", StringType)))
+
+ override def toBatch: Batch = this
+
+ override def planInputPartitions(): Array[InputPartition] = {
+ Array(new SimplePartition())
+ }
+ override def createReaderFactory(): PartitionReaderFactory = new SimplePartitionReaderFactory()
+}
+
+// simple class to organise the partition
+class SimplePartition extends InputPartition
+
+// reader factory
+class SimplePartitionReaderFactory extends PartitionReaderFactory {
+ override def createReader(partition: InputPartition): PartitionReader[InternalRow] = new SimplePartitionReader
+}
+
+
+// parathion reader
+class SimplePartitionReader extends PartitionReader[InternalRow] {
+
+ val values = Array("1", "2", "3", "4", "5")
+
+ var index = 0
+
+ def next = index < values.length
+
+ def get = {
+ val stringValue = values(index)
+ val stringUtf = UTF8String.fromString(stringValue)
+ val row = InternalRow(stringUtf)
+ index = index + 1
+ row
+ }
+
+ def close() = Unit
+
+}
+
+
+
+
diff --git a/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/datasourcev2/streamandbatch/DataSourceV2StreamAndBatchExample.scala b/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/datasourcev2/streamandbatch/DataSourceV2StreamAndBatchExample.scala
new file mode 100644
index 00000000..665ab712
--- /dev/null
+++ b/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/datasourcev2/streamandbatch/DataSourceV2StreamAndBatchExample.scala
@@ -0,0 +1,37 @@
+package org.opengauss.spark.sources.datasourcev2.streamandbatch
+
+import org.apache.spark.sql.SparkSession
+import org.apache.spark.sql.streaming.OutputMode
+
+object DataSourceV2StreamAndBatchExample {
+ def main(args: Array[String]): Unit = {
+ val sparkSession = SparkSession.builder.
+ master("local[2]")
+ .appName("streaming example")
+ .getOrCreate()
+
+
+ val dataSource = "cn.ecnu.spark.sources.datasourcev2.streamandbatch.simple"
+
+ val batchDf = sparkSession
+ .read
+ .format(dataSource)
+ .load()
+
+ batchDf.show()
+
+ val streamingDf = sparkSession.
+ readStream.
+ format(dataSource)
+ .load()
+
+ val query = streamingDf.writeStream
+ .format("console")
+ .queryName("simple_source")
+ .outputMode(OutputMode.Append())
+
+ query.start().awaitTermination()
+
+ }
+
+}
diff --git a/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleStreamAndBatchDataSource.scala b/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleStreamAndBatchDataSource.scala
new file mode 100644
index 00000000..0fe5d52f
--- /dev/null
+++ b/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleStreamAndBatchDataSource.scala
@@ -0,0 +1,130 @@
+package org.opengauss.spark.sources.datasourcev2.streamandbatch
+
+import java.util
+
+import org.apache.spark.sql.catalyst.InternalRow
+import org.apache.spark.sql.connector.catalog.{SupportsRead, Table, TableCapability, TableProvider}
+import org.apache.spark.sql.connector.expressions.Transform
+import org.apache.spark.sql.connector.read._
+import org.apache.spark.sql.connector.read.streaming.{MicroBatchStream, Offset}
+import org.apache.spark.sql.types.{StringType, StructField, StructType}
+import org.apache.spark.sql.util.CaseInsensitiveStringMap
+import org.apache.spark.unsafe.types.UTF8String
+
+import scala.collection.JavaConverters._
+
+/*
+ * Default source should some kind of relation provider
+ */
+class DefaultSource extends TableProvider{
+
+ override def inferSchema(caseInsensitiveStringMap: CaseInsensitiveStringMap): StructType =
+ getTable(null,Array.empty[Transform],caseInsensitiveStringMap.asCaseSensitiveMap()).schema()
+
+ override def getTable(structType: StructType, transforms: Array[Transform], map: util.Map[String, String]): Table =
+ new SimpleStreamingTable()
+}
+
+
+/*
+ Defines Read Support and Initial Schema
+ */
+
+class SimpleStreamingTable extends Table with SupportsRead {
+ override def name(): String = this.getClass.toString
+
+ override def schema(): StructType = StructType(Array(StructField("value", StringType)))
+
+ override def capabilities(): util.Set[TableCapability] = Set(TableCapability.MICRO_BATCH_READ,
+ TableCapability.BATCH_READ).asJava
+
+ override def newScanBuilder(options: CaseInsensitiveStringMap): ScanBuilder = new SimpleScanBuilder()
+}
+
+
+/*
+ Scan object with no mixins
+ */
+class SimpleScanBuilder extends ScanBuilder {
+ override def build(): Scan = new SimpleScan
+}
+
+/*
+ Batch Reading Support
+
+ The schema is repeated here as it can change after column pruning etc
+ */
+
+class SimpleScan extends Scan{
+ override def readSchema(): StructType = StructType(Array(StructField("value", StringType)))
+
+ override def toMicroBatchStream(checkpointLocation: String): MicroBatchStream = new SimpleMicroBatchStream()
+
+ override def toBatch: Batch = new SimpleBatch
+}
+
+class SimpleBatch extends Batch{
+ override def planInputPartitions(): Array[InputPartition] = Array(new SimplePartition)
+
+ override def createReaderFactory(): PartitionReaderFactory = new SimplePartitionReaderFactory
+}
+
+class SimpleOffset(value:Int) extends Offset {
+ override def json(): String = s"""{"value":"$value"}"""
+}
+
+class SimpleMicroBatchStream extends MicroBatchStream {
+ var latestOffsetValue = 0
+
+ override def latestOffset(): Offset = {
+ latestOffsetValue += 10
+ new SimpleOffset(latestOffsetValue)
+ }
+
+ override def planInputPartitions(offset: Offset, offset1: Offset): Array[InputPartition] = Array(new SimplePartition)
+
+ override def createReaderFactory(): PartitionReaderFactory = new SimplePartitionReaderFactory()
+
+ override def initialOffset(): Offset = new SimpleOffset(latestOffsetValue)
+
+ override def deserializeOffset(s: String): Offset = new SimpleOffset(latestOffsetValue)
+
+ override def commit(offset: Offset): Unit = {}
+
+ override def stop(): Unit = {}
+}
+
+
+// simple class to organise the partition
+class SimplePartition extends InputPartition
+
+// reader factory
+class SimplePartitionReaderFactory extends PartitionReaderFactory {
+ override def createReader(partition: InputPartition): PartitionReader[InternalRow] = new SimplePartitionReader
+}
+
+
+// parathion reader
+class SimplePartitionReader extends PartitionReader[InternalRow] {
+
+ val values = Array("1", "2", "3", "4", "5")
+
+ var index = 0
+
+ def next = index < values.length
+
+ def get = {
+ val stringValue = values(index)
+ val stringUtf = UTF8String.fromString(stringValue)
+ val row = InternalRow(stringUtf)
+ index = index + 1
+ row
+ }
+
+ def close() = Unit
+
+}
+
+
+
+
diff --git a/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/datasourcev2/streaming/DataSourceV2StreamingExample.scala b/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/datasourcev2/streaming/DataSourceV2StreamingExample.scala
new file mode 100644
index 00000000..aebb6d79
--- /dev/null
+++ b/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/datasourcev2/streaming/DataSourceV2StreamingExample.scala
@@ -0,0 +1,29 @@
+package org.opengauss.spark.sources.datasourcev2.streaming
+
+import org.apache.spark.sql.SparkSession
+import org.apache.spark.sql.streaming.OutputMode
+
+object DataSourceV2StreamingExample {
+ def main(args: Array[String]): Unit = {
+ val sparkSession = SparkSession.builder.
+ master("local[2]")
+ .appName("streaming example")
+ .getOrCreate()
+
+ val streamingDf = sparkSession.
+ readStream.
+ format("cn.ecnu.spark.sources.datasourcev2.streaming.simple")
+ .load()
+
+
+
+ val query = streamingDf.writeStream
+ .format("console")
+ .queryName("simple_source")
+ .outputMode(OutputMode.Append())
+
+ query.start().awaitTermination()
+
+ }
+
+}
diff --git a/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/datasourcev2/streaming/SimpleStreamingDataSource.scala b/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/datasourcev2/streaming/SimpleStreamingDataSource.scala
new file mode 100644
index 00000000..89a37b8d
--- /dev/null
+++ b/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/datasourcev2/streaming/SimpleStreamingDataSource.scala
@@ -0,0 +1,121 @@
+package org.opengauss.spark.sources.datasourcev2.streaming
+
+import java.util
+
+import org.apache.spark.sql.catalyst.InternalRow
+import org.apache.spark.sql.connector.catalog.{SupportsRead, Table, TableCapability, TableProvider}
+import org.apache.spark.sql.connector.expressions.Transform
+import org.apache.spark.sql.connector.read._
+import org.apache.spark.sql.connector.read.streaming.{MicroBatchStream, Offset}
+import org.apache.spark.sql.types.{StringType, StructField, StructType}
+import org.apache.spark.sql.util.CaseInsensitiveStringMap
+import org.apache.spark.unsafe.types.UTF8String
+
+import scala.collection.JavaConverters._
+
+/*
+ * Default source should some kind of relation provider
+ */
+class DefaultSource extends TableProvider{
+
+ override def inferSchema(caseInsensitiveStringMap: CaseInsensitiveStringMap): StructType =
+ getTable(null,Array.empty[Transform],caseInsensitiveStringMap.asCaseSensitiveMap()).schema()
+
+ override def getTable(structType: StructType, transforms: Array[Transform], map: util.Map[String, String]): Table =
+ new SimpleStreamingTable()
+}
+
+
+/*
+ Defines Read Support and Initial Schema
+ */
+
+class SimpleStreamingTable extends Table with SupportsRead {
+ override def name(): String = this.getClass.toString
+
+ override def schema(): StructType = StructType(Array(StructField("value", StringType)))
+
+ override def capabilities(): util.Set[TableCapability] = Set(TableCapability.MICRO_BATCH_READ).asJava
+
+ override def newScanBuilder(options: CaseInsensitiveStringMap): ScanBuilder = new SimpleScanBuilder()
+}
+
+
+/*
+ Scan object with no mixins
+ */
+class SimpleScanBuilder extends ScanBuilder {
+ override def build(): Scan = new SimpleScan
+}
+
+/*
+ Batch Reading Support
+
+ The schema is repeated here as it can change after column pruning etc
+ */
+
+class SimpleScan extends Scan{
+ override def readSchema(): StructType = StructType(Array(StructField("value", StringType)))
+
+ override def toMicroBatchStream(checkpointLocation: String): MicroBatchStream = new SimpleMicroBatchStream()
+}
+
+class SimpleOffset(value:Int) extends Offset {
+ override def json(): String = s"""{"value":"$value"}"""
+}
+
+class SimpleMicroBatchStream extends MicroBatchStream {
+ var latestOffsetValue = 0
+
+ override def latestOffset(): Offset = {
+ latestOffsetValue += 10
+ new SimpleOffset(latestOffsetValue)
+ }
+
+ override def planInputPartitions(offset: Offset, offset1: Offset): Array[InputPartition] = Array(new SimplePartition)
+
+ override def createReaderFactory(): PartitionReaderFactory = new SimplePartitionReaderFactory()
+
+ override def initialOffset(): Offset = new SimpleOffset(latestOffsetValue)
+
+ override def deserializeOffset(s: String): Offset = new SimpleOffset(latestOffsetValue)
+
+ override def commit(offset: Offset): Unit = {}
+
+ override def stop(): Unit = {}
+}
+
+
+// simple class to organise the partition
+class SimplePartition extends InputPartition
+
+// reader factory
+class SimplePartitionReaderFactory extends PartitionReaderFactory {
+ override def createReader(partition: InputPartition): PartitionReader[InternalRow] = new SimplePartitionReader
+}
+
+
+// parathion reader
+class SimplePartitionReader extends PartitionReader[InternalRow] {
+
+ val values = Array("1", "2", "3", "4", "5")
+
+ var index = 0
+
+ def next = index < values.length
+
+ def get = {
+ val stringValue = values(index)
+ val stringUtf = UTF8String.fromString(stringValue)
+ val row = InternalRow(stringUtf)
+ index = index + 1
+ row
+ }
+
+ def close() = Unit
+
+}
+
+
+
+
diff --git a/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/opengauss/OpenGaussDataSource.scala b/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/opengauss/OpenGaussDataSource.scala
new file mode 100644
index 00000000..89625577
--- /dev/null
+++ b/SparkOpOpenGauss/src/main/scala/org/opengauss/spark/sources/opengauss/OpenGaussDataSource.scala
@@ -0,0 +1,152 @@
+package org.opengauss.spark.sources.opengauss
+
+import java.sql.DriverManager
+import java.util
+
+import org.apache.spark.sql.catalyst.InternalRow
+import org.apache.spark.sql.connector.catalog._
+import org.apache.spark.sql.connector.expressions.Transform
+import org.apache.spark.sql.connector.read._
+import org.apache.spark.sql.connector.write._
+import org.apache.spark.sql.types.{DoubleType, IntegerType, StringType, StructField, StructType}
+import org.apache.spark.sql.util.CaseInsensitiveStringMap
+import org.apache.spark.unsafe.types.UTF8String
+
+import scala.collection.JavaConverters._
+
+class DefaultSource extends TableProvider {
+ override def inferSchema(options: CaseInsensitiveStringMap): StructType = OpenGaussTable.schema
+
+ override def getTable(
+ schema: StructType,
+ partitioning: Array[Transform],
+ properties: util.Map[String, String]
+ ): Table = new OpenGaussTable(properties.get("tableName")) // TODO: Error handling
+}
+
+class OpenGaussTable(val name: String) extends SupportsRead with SupportsWrite {
+ override def schema(): StructType = OpenGaussTable.schema
+
+ override def capabilities(): util.Set[TableCapability] = Set(
+ TableCapability.BATCH_READ,
+ TableCapability.BATCH_WRITE
+ ).asJava
+
+ override def newScanBuilder(options: CaseInsensitiveStringMap): ScanBuilder = new OpenGaussScanBuilder(options)
+
+ override def newWriteBuilder(info: LogicalWriteInfo): WriteBuilder = new OpenGaussWriteBuilder(info.options)
+}
+
+object OpenGaussTable {
+ /*Table products*/
+ /*Database school, table course*/
+ val schema: StructType = new StructType().add("cor_id", IntegerType).add("cor_name", StringType).add("cor_type", StringType).add("credit", DoubleType)
+}
+
+case class ConnectionProperties(url: String, user: String, password: String, tableName: String, partitionColumn: String, partitionSize: Int)
+
+
+
+/** Read */
+
+class OpenGaussScanBuilder(options: CaseInsensitiveStringMap) extends ScanBuilder {
+ override def build(): Scan = new OpenGaussScan(ConnectionProperties(
+ options.get("url"), options.get("user"), options.get("password"), options.get("tableName"), options.get("partitionColumn"), options.get("partitionSize").toInt
+ ))
+}
+
+class OpenGaussPartition extends InputPartition
+
+class OpenGaussScan(connectionProperties: ConnectionProperties) extends Scan with Batch {
+ override def readSchema(): StructType = OpenGaussTable.schema
+
+ override def toBatch: Batch = this
+
+ override def planInputPartitions(): Array[InputPartition] = Array(new OpenGaussPartition)
+
+ override def createReaderFactory(): PartitionReaderFactory = new OpenGaussPartitionReaderFactory(connectionProperties)
+}
+
+class OpenGaussPartitionReaderFactory(connectionProperties: ConnectionProperties)
+ extends PartitionReaderFactory {
+ override def createReader(partition: InputPartition): PartitionReader[InternalRow] = new OpenGaussPartitionReader(connectionProperties)
+}
+
+
+
+class OpenGaussPartitionReader(connectionProperties: ConnectionProperties) extends PartitionReader[InternalRow] {
+ private val connection = DriverManager.getConnection(
+ connectionProperties.url, connectionProperties.user, connectionProperties.password
+ )
+ private val statement = connection.createStatement()
+ private val resultSet = statement.executeQuery(s"select * from ${connectionProperties.tableName}")
+
+ override def next(): Boolean = resultSet.next()
+
+ override def get(): InternalRow = InternalRow(
+ resultSet.getInt(1),
+ UTF8String.fromString(resultSet.getString(2)),
+ UTF8String.fromString(resultSet.getString(3)),
+ resultSet.getDouble(4))
+
+ override def close(): Unit = connection.close()
+
+}
+
+
+
+/** Write */
+
+class OpenGaussWriteBuilder(options: CaseInsensitiveStringMap) extends WriteBuilder {
+ override def buildForBatch(): BatchWrite = new OpenGaussBatchWrite(ConnectionProperties(
+ options.get("url"), options.get("user"), options.get("password"), options.get("tableName"), options.get("partitionColumn"), options.get("partitionSize").toInt
+ ))
+}
+
+class OpenGaussBatchWrite(connectionProperties: ConnectionProperties) extends BatchWrite {
+ override def createBatchWriterFactory(physicalWriteInfo: PhysicalWriteInfo): DataWriterFactory =
+ new OpenGaussDataWriterFactory(connectionProperties)
+
+ override def commit(writerCommitMessages: Array[WriterCommitMessage]): Unit = {}
+
+ override def abort(writerCommitMessages: Array[WriterCommitMessage]): Unit = {}
+}
+
+class OpenGaussDataWriterFactory(connectionProperties: ConnectionProperties) extends DataWriterFactory {
+ override def createWriter(partitionId: Int, taskId:Long): DataWriter[InternalRow] =
+ new OpenGaussWriter(connectionProperties)
+}
+
+object WriteSucceeded extends WriterCommitMessage
+
+class OpenGaussWriter(connectionProperties: ConnectionProperties) extends DataWriter[InternalRow] {
+
+ val connection = DriverManager.getConnection(
+ connectionProperties.url,
+ connectionProperties.user,
+ connectionProperties.password
+ )
+
+ // TODO:待修改
+ val statement = "insert into ${connectionProperties.tableName} (cor_name, cor_type, credit) values (?,?,?)"
+ val preparedStatement = connection.prepareStatement(statement)
+
+ override def write(record: InternalRow): Unit = {
+ val cor_name = record.getString(0)
+ val cor_type = record.getString(1)
+ val credit = record.getDouble(2)
+
+ preparedStatement.setString(0, cor_name)
+ preparedStatement.setString(1, cor_type)
+ preparedStatement.setDouble(2, credit)
+ preparedStatement.executeUpdate()
+ }
+
+ override def commit(): WriterCommitMessage = WriteSucceeded
+
+ override def abort(): Unit = {}
+
+ override def close(): Unit = connection.close()
+}
+
+
diff --git a/SparkOpOpenGauss/src/test/scala/org/opengauss/spark/OpenGaussExample.scala b/SparkOpOpenGauss/src/test/scala/org/opengauss/spark/OpenGaussExample.scala
new file mode 100644
index 00000000..53ad067b
--- /dev/null
+++ b/SparkOpOpenGauss/src/test/scala/org/opengauss/spark/OpenGaussExample.scala
@@ -0,0 +1,97 @@
+package org.opengauss.spark
+
+import org.apache.spark.sql.{SaveMode, SparkSession}
+import org.scalatest.FlatSpec
+import java.sql.DriverManager
+import java.util.Properties
+
+import org.scalatest.Matchers.convertToAnyShouldWrapper
+
+class OpenGaussExample extends FlatSpec {
+
+ val testTableName = "course"
+
+ "Simple data source" should "read" in{
+ val sparkSession = SparkSession.builder
+ .master("local[2]")
+ .appName("example")
+ .getOrCreate()
+
+ val simpleDf = sparkSession.read
+ .format("cn.ecnu.spark.sources.datasourcev2.simple")
+ .load()
+
+ simpleDf.show()
+ println(
+ "number of partitions in simple source is " + simpleDf.rdd.getNumPartitions)
+ }
+
+
+ "openGauss data source" should "read table" in {
+ val spark = SparkSession
+ .builder()
+ .master("local[*]")
+ .appName("OpenGaussReaderJob")
+ .getOrCreate()
+
+ val simpleRead = spark
+ .read
+ .format("org.opengauss.spark.sources.opengauss")
+ .option("url", "jdbc:postgresql://x.x.x.x:port/school")
+ .option("user", "sparkuser")
+ .option("password", "Enmo@123")
+ .option("tableName", testTableName)
+ .option("partitionSize", 10)
+// .option("partitionColumn", "name")
+ .load()
+ .show()
+
+ spark.stop()
+ }
+
+ "openGauss data source" should "write table" in {
+ val spark = SparkSession
+ .builder()
+ .master("local[*]")
+ .appName("OpenGaussWriterJob")
+ .getOrCreate()
+
+ import spark.implicits._
+
+ val df = (60 to 70).map(_.toLong).toDF("product_no")
+
+ df
+ .write
+ .format("org.opengauss.spark.sources.opengauss")
+ .option("url", "jdbc:postgresql://x.x.x.x:port/postgres")
+ .option("user", "sparkuser")
+ .option("password", "Enmo@123")
+ .option("tableName", testTableName)
+ .option("partitionSize", 10)
+ .option("partitionColumn", "product_no")
+ .mode(SaveMode.Append)
+ .save()
+
+ spark.stop()
+ }
+
+
+
+// def connection(c: PostgreSQLContainer) = {
+// Class.forName(c.driverClassName)
+// val properties = new Properties()
+// properties.put("user", c.username)
+// properties.put("password", c.password)
+// DriverManager.getConnection(c.jdbcUrl, properties)
+// }
+
+ object Queries {
+ lazy val createTableQuery = s"CREATE TABLE $testTableName (user_id BIGINT PRIMARY KEY);"
+
+ lazy val testValues: String = (1 to 50).map(i => s"($i)").mkString(", ")
+
+ lazy val insertDataQuery = s"INSERT INTO $testTableName VALUES $testValues;"
+ }
+
+}
+
diff --git a/SparkOpOpenGauss/target/classes/adult.csv b/SparkOpOpenGauss/target/classes/adult.csv
new file mode 100644
index 00000000..2aae7c3d
--- /dev/null
+++ b/SparkOpOpenGauss/target/classes/adult.csv
@@ -0,0 +1,102 @@
+age,workclass,fnlwgt,education,education_num,martial_status,occupation,relationship,race,sex,capital_gain,capital_loss,hours_per_week,native_country,salary
+39, State-gov, 77516, Bachelors, 13, Never-married, Adm-clerical, Not-in-family, White, Male, 2174, 0, 40, United-States, <=50K
+50, Self-emp-not-inc, 83311, Bachelors, 13, Married-civ-spouse, Exec-managerial, Husband, White, Male, 0, 0, 13, United-States, <=50K
+38, Private, 215646, HS-grad, 9, Divorced, Handlers-cleaners, Not-in-family, White, Male, 0, 0, 40, United-States, <=50K
+53, Private, 234721, 11th, 7, Married-civ-spouse, Handlers-cleaners, Husband, Black, Male, 0, 0, 40, United-States, <=50K
+28, Private, 338409, Bachelors, 13, Married-civ-spouse, Prof-specialty, Wife, Black, Female, 0, 0, 40, Cuba, <=50K
+37, Private, 284582, Masters, 14, Married-civ-spouse, Exec-managerial, Wife, White, Female, 0, 0, 40, United-States, <=50K
+49, Private, 160187, 9th, 5, Married-spouse-absent, Other-service, Not-in-family, Black, Female, 0, 0, 16, Jamaica, <=50K
+52, Self-emp-not-inc, 209642, HS-grad, 9, Married-civ-spouse, Exec-managerial, Husband, White, Male, 0, 0, 45, United-States, >50K
+31, Private, 45781, Masters, 14, Never-married, Prof-specialty, Not-in-family, White, Female, 14084, 0, 50, United-States, >50K
+42, Private, 159449, Bachelors, 13, Married-civ-spouse, Exec-managerial, Husband, White, Male, 5178, 0, 40, United-States, >50K
+37, Private, 280464, Some-college, 10, Married-civ-spouse, Exec-managerial, Husband, Black, Male, 0, 0, 80, United-States, >50K
+30, State-gov, 141297, Bachelors, 13, Married-civ-spouse, Prof-specialty, Husband, Asian-Pac-Islander, Male, 0, 0, 40, India, >50K
+23, Private, 122272, Bachelors, 13, Never-married, Adm-clerical, Own-child, White, Female, 0, 0, 30, United-States, <=50K
+32, Private, 205019, Assoc-acdm, 12, Never-married, Sales, Not-in-family, Black, Male, 0, 0, 50, United-States, <=50K
+40, Private, 121772, Assoc-voc, 11, Married-civ-spouse, Craft-repair, Husband, Asian-Pac-Islander, Male, 0, 0, 40, ?, >50K
+34, Private, 245487, 7th-8th, 4, Married-civ-spouse, Transport-moving, Husband, Amer-Indian-Eskimo, Male, 0, 0, 45, Mexico, <=50K
+25, Self-emp-not-inc, 176756, HS-grad, 9, Never-married, Farming-fishing, Own-child, White, Male, 0, 0, 35, United-States, <=50K
+32, Private, 186824, HS-grad, 9, Never-married, Machine-op-inspct, Unmarried, White, Male, 0, 0, 40, United-States, <=50K
+38, Private, 28887, 11th, 7, Married-civ-spouse, Sales, Husband, White, Male, 0, 0, 50, United-States, <=50K
+43, Self-emp-not-inc, 292175, Masters, 14, Divorced, Exec-managerial, Unmarried, White, Female, 0, 0, 45, United-States, >50K
+40, Private, 193524, Doctorate, 16, Married-civ-spouse, Prof-specialty, Husband, White, Male, 0, 0, 60, United-States, >50K
+54, Private, 302146, HS-grad, 9, Separated, Other-service, Unmarried, Black, Female, 0, 0, 20, United-States, <=50K
+35, Federal-gov, 76845, 9th, 5, Married-civ-spouse, Farming-fishing, Husband, Black, Male, 0, 0, 40, United-States, <=50K
+43, Private, 117037, 11th, 7, Married-civ-spouse, Transport-moving, Husband, White, Male, 0, 2042, 40, United-States, <=50K
+59, Private, 109015, HS-grad, 9, Divorced, Tech-support, Unmarried, White, Female, 0, 0, 40, United-States, <=50K
+56, Local-gov, 216851, Bachelors, 13, Married-civ-spouse, Tech-support, Husband, White, Male, 0, 0, 40, United-States, >50K
+19, Private, 168294, HS-grad, 9, Never-married, Craft-repair, Own-child, White, Male, 0, 0, 40, United-States, <=50K
+54, ?, 180211, Some-college, 10, Married-civ-spouse, ?, Husband, Asian-Pac-Islander, Male, 0, 0, 60, South, >50K
+39, Private, 367260, HS-grad, 9, Divorced, Exec-managerial, Not-in-family, White, Male, 0, 0, 80, United-States, <=50K
+49, Private, 193366, HS-grad, 9, Married-civ-spouse, Craft-repair, Husband, White, Male, 0, 0, 40, United-States, <=50K
+23, Local-gov, 190709, Assoc-acdm, 12, Never-married, Protective-serv, Not-in-family, White, Male, 0, 0, 52, United-States, <=50K
+20, Private, 266015, Some-college, 10, Never-married, Sales, Own-child, Black, Male, 0, 0, 44, United-States, <=50K
+45, Private, 386940, Bachelors, 13, Divorced, Exec-managerial, Own-child, White, Male, 0, 1408, 40, United-States, <=50K
+30, Federal-gov, 59951, Some-college, 10, Married-civ-spouse, Adm-clerical, Own-child, White, Male, 0, 0, 40, United-States, <=50K
+22, State-gov, 311512, Some-college, 10, Married-civ-spouse, Other-service, Husband, Black, Male, 0, 0, 15, United-States, <=50K
+48, Private, 242406, 11th, 7, Never-married, Machine-op-inspct, Unmarried, White, Male, 0, 0, 40, Puerto-Rico, <=50K
+21, Private, 197200, Some-college, 10, Never-married, Machine-op-inspct, Own-child, White, Male, 0, 0, 40, United-States, <=50K
+19, Private, 544091, HS-grad, 9, Married-AF-spouse, Adm-clerical, Wife, White, Female, 0, 0, 25, United-States, <=50K
+31, Private, 84154, Some-college, 10, Married-civ-spouse, Sales, Husband, White, Male, 0, 0, 38, ?, >50K
+48, Self-emp-not-inc, 265477, Assoc-acdm, 12, Married-civ-spouse, Prof-specialty, Husband, White, Male, 0, 0, 40, United-States, <=50K
+31, Private, 507875, 9th, 5, Married-civ-spouse, Machine-op-inspct, Husband, White, Male, 0, 0, 43, United-States, <=50K
+53, Self-emp-not-inc, 88506, Bachelors, 13, Married-civ-spouse, Prof-specialty, Husband, White, Male, 0, 0, 40, United-States, <=50K
+24, Private, 172987, Bachelors, 13, Married-civ-spouse, Tech-support, Husband, White, Male, 0, 0, 50, United-States, <=50K
+49, Private, 94638, HS-grad, 9, Separated, Adm-clerical, Unmarried, White, Female, 0, 0, 40, United-States, <=50K
+25, Private, 289980, HS-grad, 9, Never-married, Handlers-cleaners, Not-in-family, White, Male, 0, 0, 35, United-States, <=50K
+57, Federal-gov, 337895, Bachelors, 13, Married-civ-spouse, Prof-specialty, Husband, Black, Male, 0, 0, 40, United-States, >50K
+53, Private, 144361, HS-grad, 9, Married-civ-spouse, Machine-op-inspct, Husband, White, Male, 0, 0, 38, United-States, <=50K
+44, Private, 128354, Masters, 14, Divorced, Exec-managerial, Unmarried, White, Female, 0, 0, 40, United-States, <=50K
+41, State-gov, 101603, Assoc-voc, 11, Married-civ-spouse, Craft-repair, Husband, White, Male, 0, 0, 40, United-States, <=50K
+29, Private, 271466, Assoc-voc, 11, Never-married, Prof-specialty, Not-in-family, White, Male, 0, 0, 43, United-States, <=50K
+25, Private, 32275, Some-college, 10, Married-civ-spouse, Exec-managerial, Wife, Other, Female, 0, 0, 40, United-States, <=50K
+18, Private, 226956, HS-grad, 9, Never-married, Other-service, Own-child, White, Female, 0, 0, 30, ?, <=50K
+47, Private, 51835, Prof-school, 15, Married-civ-spouse, Prof-specialty, Wife, White, Female, 0, 1902, 60, Honduras, >50K
+50, Federal-gov, 251585, Bachelors, 13, Divorced, Exec-managerial, Not-in-family, White, Male, 0, 0, 55, United-States, >50K
+47, Self-emp-inc, 109832, HS-grad, 9, Divorced, Exec-managerial, Not-in-family, White, Male, 0, 0, 60, United-States, <=50K
+43, Private, 237993, Some-college, 10, Married-civ-spouse, Tech-support, Husband, White, Male, 0, 0, 40, United-States, >50K
+46, Private, 216666, 5th-6th, 3, Married-civ-spouse, Machine-op-inspct, Husband, White, Male, 0, 0, 40, Mexico, <=50K
+35, Private, 56352, Assoc-voc, 11, Married-civ-spouse, Other-service, Husband, White, Male, 0, 0, 40, Puerto-Rico, <=50K
+41, Private, 147372, HS-grad, 9, Married-civ-spouse, Adm-clerical, Husband, White, Male, 0, 0, 48, United-States, <=50K
+30, Private, 188146, HS-grad, 9, Married-civ-spouse, Machine-op-inspct, Husband, White, Male, 5013, 0, 40, United-States, <=50K
+30, Private, 59496, Bachelors, 13, Married-civ-spouse, Sales, Husband, White, Male, 2407, 0, 40, United-States, <=50K
+32, ?, 293936, 7th-8th, 4, Married-spouse-absent, ?, Not-in-family, White, Male, 0, 0, 40, ?, <=50K
+48, Private, 149640, HS-grad, 9, Married-civ-spouse, Transport-moving, Husband, White, Male, 0, 0, 40, United-States, <=50K
+42, Private, 116632, Doctorate, 16, Married-civ-spouse, Prof-specialty, Husband, White, Male, 0, 0, 45, United-States, >50K
+29, Private, 105598, Some-college, 10, Divorced, Tech-support, Not-in-family, White, Male, 0, 0, 58, United-States, <=50K
+36, Private, 155537, HS-grad, 9, Married-civ-spouse, Craft-repair, Husband, White, Male, 0, 0, 40, United-States, <=50K
+28, Private, 183175, Some-college, 10, Divorced, Adm-clerical, Not-in-family, White, Female, 0, 0, 40, United-States, <=50K
+53, Private, 169846, HS-grad, 9, Married-civ-spouse, Adm-clerical, Wife, White, Female, 0, 0, 40, United-States, >50K
+49, Self-emp-inc, 191681, Some-college, 10, Married-civ-spouse, Exec-managerial, Husband, White, Male, 0, 0, 50, United-States, >50K
+25, ?, 200681, Some-college, 10, Never-married, ?, Own-child, White, Male, 0, 0, 40, United-States, <=50K
+19, Private, 101509, Some-college, 10, Never-married, Prof-specialty, Own-child, White, Male, 0, 0, 32, United-States, <=50K
+31, Private, 309974, Bachelors, 13, Separated, Sales, Own-child, Black, Female, 0, 0, 40, United-States, <=50K
+29, Self-emp-not-inc, 162298, Bachelors, 13, Married-civ-spouse, Sales, Husband, White, Male, 0, 0, 70, United-States, >50K
+23, Private, 211678, Some-college, 10, Never-married, Machine-op-inspct, Not-in-family, White, Male, 0, 0, 40, United-States, <=50K
+79, Private, 124744, Some-college, 10, Married-civ-spouse, Prof-specialty, Other-relative, White, Male, 0, 0, 20, United-States, <=50K
+27, Private, 213921, HS-grad, 9, Never-married, Other-service, Own-child, White, Male, 0, 0, 40, Mexico, <=50K
+40, Private, 32214, Assoc-acdm, 12, Married-civ-spouse, Adm-clerical, Husband, White, Male, 0, 0, 40, United-States, <=50K
+67, ?, 212759, 10th, 6, Married-civ-spouse, ?, Husband, White, Male, 0, 0, 2, United-States, <=50K
+18, Private, 309634, 11th, 7, Never-married, Other-service, Own-child, White, Female, 0, 0, 22, United-States, <=50K
+31, Local-gov, 125927, 7th-8th, 4, Married-civ-spouse, Farming-fishing, Husband, White, Male, 0, 0, 40, United-States, <=50K
+18, Private, 446839, HS-grad, 9, Never-married, Sales, Not-in-family, White, Male, 0, 0, 30, United-States, <=50K
+52, Private, 276515, Bachelors, 13, Married-civ-spouse, Other-service, Husband, White, Male, 0, 0, 40, Cuba, <=50K
+46, Private, 51618, HS-grad, 9, Married-civ-spouse, Other-service, Wife, White, Female, 0, 0, 40, United-States, <=50K
+59, Private, 159937, HS-grad, 9, Married-civ-spouse, Sales, Husband, White, Male, 0, 0, 48, United-States, <=50K
+44, Private, 343591, HS-grad, 9, Divorced, Craft-repair, Not-in-family, White, Female, 14344, 0, 40, United-States, >50K
+53, Private, 346253, HS-grad, 9, Divorced, Sales, Own-child, White, Female, 0, 0, 35, United-States, <=50K
+49, Local-gov, 268234, HS-grad, 9, Married-civ-spouse, Protective-serv, Husband, White, Male, 0, 0, 40, United-States, >50K
+33, Private, 202051, Masters, 14, Married-civ-spouse, Prof-specialty, Husband, White, Male, 0, 0, 50, United-States, <=50K
+30, Private, 54334, 9th, 5, Never-married, Sales, Not-in-family, White, Male, 0, 0, 40, United-States, <=50K
+43, Federal-gov, 410867, Doctorate, 16, Never-married, Prof-specialty, Not-in-family, White, Female, 0, 0, 50, United-States, >50K
+57, Private, 249977, Assoc-voc, 11, Married-civ-spouse, Prof-specialty, Husband, White, Male, 0, 0, 40, United-States, <=50K
+37, Private, 286730, Some-college, 10, Divorced, Craft-repair, Unmarried, White, Female, 0, 0, 40, United-States, <=50K
+28, Private, 212563, Some-college, 10, Divorced, Machine-op-inspct, Unmarried, Black, Female, 0, 0, 25, United-States, <=50K
+30, Private, 117747, HS-grad, 9, Married-civ-spouse, Sales, Wife, Asian-Pac-Islander, Female, 0, 1573, 35, ?, <=50K
+34, Local-gov, 226296, Bachelors, 13, Married-civ-spouse, Protective-serv, Husband, White, Male, 0, 0, 40, United-States, >50K
+29, Local-gov, 115585, Some-college, 10, Never-married, Handlers-cleaners, Not-in-family, White, Male, 0, 0, 50, United-States, <=50K
+48, Self-emp-not-inc, 191277, Doctorate, 16, Married-civ-spouse, Prof-specialty, Husband, White, Male, 0, 1902, 60, United-States, >50K
+37, Private, 202683, Some-college, 10, Married-civ-spouse, Sales, Husband, White, Male, 0, 0, 48, United-States, >50K
+48, Private, 171095, Assoc-acdm, 12, Divorced, Exec-managerial, Unmarried, White, Female, 0, 0, 40, England, <=50K
+32, Federal-gov, 249409, HS-grad, 9, Never-married, Other-service, Own-child, Black, Male, 0, 0, 40, United-States, <=50K
+76, Private, 124191, Masters, 14, Married-civ-spouse, Exec-managerial, Husband, White, Male, 0, 0, 40, United-States, >50K
diff --git a/SparkOpOpenGauss/target/classes/customers.csv b/SparkOpOpenGauss/target/classes/customers.csv
new file mode 100644
index 00000000..0b4f8528
--- /dev/null
+++ b/SparkOpOpenGauss/target/classes/customers.csv
@@ -0,0 +1,5 @@
+customerId,customerName
+1,John
+2,Clerk
+3,Micheal
+4,Sample
diff --git a/SparkOpOpenGauss/target/classes/metrics.properties b/SparkOpOpenGauss/target/classes/metrics.properties
new file mode 100644
index 00000000..a882870e
--- /dev/null
+++ b/SparkOpOpenGauss/target/classes/metrics.properties
@@ -0,0 +1 @@
+*.sink.console.class=org.apache.spark.metrics.sink.ConsoleSink
\ No newline at end of file
diff --git a/SparkOpOpenGauss/target/classes/multicharacterseperator.csv b/SparkOpOpenGauss/target/classes/multicharacterseperator.csv
new file mode 100644
index 00000000..9db32e5b
--- /dev/null
+++ b/SparkOpOpenGauss/target/classes/multicharacterseperator.csv
@@ -0,0 +1,3 @@
+a||b||c||d
+1||2||3||4
+5||6||7||8
\ No newline at end of file
diff --git a/SparkOpOpenGauss/target/classes/nested/a.csv b/SparkOpOpenGauss/target/classes/nested/a.csv
new file mode 100644
index 00000000..9db32e5b
--- /dev/null
+++ b/SparkOpOpenGauss/target/classes/nested/a.csv
@@ -0,0 +1,3 @@
+a||b||c||d
+1||2||3||4
+5||6||7||8
\ No newline at end of file
diff --git a/SparkOpOpenGauss/target/classes/nested/folder1/b.csv b/SparkOpOpenGauss/target/classes/nested/folder1/b.csv
new file mode 100644
index 00000000..9db32e5b
--- /dev/null
+++ b/SparkOpOpenGauss/target/classes/nested/folder1/b.csv
@@ -0,0 +1,3 @@
+a||b||c||d
+1||2||3||4
+5||6||7||8
\ No newline at end of file
diff --git a/SparkOpOpenGauss/target/classes/org/apache/spark/examples/sql/SQLDataSourceExample$$typecreator16$1.class b/SparkOpOpenGauss/target/classes/org/apache/spark/examples/sql/SQLDataSourceExample$$typecreator16$1.class
new file mode 100644
index 00000000..f77a630d
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/apache/spark/examples/sql/SQLDataSourceExample$$typecreator16$1.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/apache/spark/examples/sql/SQLDataSourceExample$$typecreator6$1.class b/SparkOpOpenGauss/target/classes/org/apache/spark/examples/sql/SQLDataSourceExample$$typecreator6$1.class
new file mode 100644
index 00000000..d872c15e
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/apache/spark/examples/sql/SQLDataSourceExample$$typecreator6$1.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/apache/spark/examples/sql/SQLDataSourceExample$.class b/SparkOpOpenGauss/target/classes/org/apache/spark/examples/sql/SQLDataSourceExample$.class
new file mode 100644
index 00000000..d42d130c
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/apache/spark/examples/sql/SQLDataSourceExample$.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/apache/spark/examples/sql/SQLDataSourceExample$Person$.class b/SparkOpOpenGauss/target/classes/org/apache/spark/examples/sql/SQLDataSourceExample$Person$.class
new file mode 100644
index 00000000..451c5609
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/apache/spark/examples/sql/SQLDataSourceExample$Person$.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/apache/spark/examples/sql/SQLDataSourceExample$Person.class b/SparkOpOpenGauss/target/classes/org/apache/spark/examples/sql/SQLDataSourceExample$Person.class
new file mode 100644
index 00000000..42032d9a
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/apache/spark/examples/sql/SQLDataSourceExample$Person.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/apache/spark/examples/sql/SQLDataSourceExample.class b/SparkOpOpenGauss/target/classes/org/apache/spark/examples/sql/SQLDataSourceExample.class
new file mode 100644
index 00000000..ef6bac06
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/apache/spark/examples/sql/SQLDataSourceExample.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/DefaultSource.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/DefaultSource.class
new file mode 100644
index 00000000..16ad16b7
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/DefaultSource.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/SimpleBatchTable.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/SimpleBatchTable.class
new file mode 100644
index 00000000..776b3109
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/SimpleBatchTable.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/SimplePartition.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/SimplePartition.class
new file mode 100644
index 00000000..b301508c
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/SimplePartition.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/SimplePartitionReader.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/SimplePartitionReader.class
new file mode 100644
index 00000000..d36c13c3
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/SimplePartitionReader.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/SimplePartitionReaderFactory.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/SimplePartitionReaderFactory.class
new file mode 100644
index 00000000..a4b5022d
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/SimplePartitionReaderFactory.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/SimpleScan.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/SimpleScan.class
new file mode 100644
index 00000000..f52c07ab
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/SimpleScan.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/SimpleScanBuilder.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/SimpleScanBuilder.class
new file mode 100644
index 00000000..41d3b315
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/multi/SimpleScanBuilder.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/DefaultSource.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/DefaultSource.class
new file mode 100644
index 00000000..966a613c
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/DefaultSource.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/SimpleBatchTable.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/SimpleBatchTable.class
new file mode 100644
index 00000000..88bb21f6
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/SimpleBatchTable.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/SimplePartition.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/SimplePartition.class
new file mode 100644
index 00000000..3862f3f9
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/SimplePartition.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/SimplePartitionReader.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/SimplePartitionReader.class
new file mode 100644
index 00000000..d1c1481f
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/SimplePartitionReader.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/SimplePartitionReaderFactory.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/SimplePartitionReaderFactory.class
new file mode 100644
index 00000000..3d5d337f
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/SimplePartitionReaderFactory.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/SimpleScan.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/SimpleScan.class
new file mode 100644
index 00000000..e6ad939b
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/SimpleScan.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/SimpleScanBuilder.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/SimpleScanBuilder.class
new file mode 100644
index 00000000..e91ef9b8
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/simple/SimpleScanBuilder.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/DataSourceV2StreamAndBatchExample$.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/DataSourceV2StreamAndBatchExample$.class
new file mode 100644
index 00000000..dccb9ca1
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/DataSourceV2StreamAndBatchExample$.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/DataSourceV2StreamAndBatchExample.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/DataSourceV2StreamAndBatchExample.class
new file mode 100644
index 00000000..b6bc0966
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/DataSourceV2StreamAndBatchExample.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/DefaultSource.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/DefaultSource.class
new file mode 100644
index 00000000..e8e5e9bf
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/DefaultSource.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleBatch.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleBatch.class
new file mode 100644
index 00000000..b4fdca4b
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleBatch.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleMicroBatchStream.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleMicroBatchStream.class
new file mode 100644
index 00000000..e1e17d7d
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleMicroBatchStream.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleOffset.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleOffset.class
new file mode 100644
index 00000000..20c9ae68
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleOffset.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimplePartition.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimplePartition.class
new file mode 100644
index 00000000..d33ddf32
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimplePartition.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimplePartitionReader.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimplePartitionReader.class
new file mode 100644
index 00000000..44078c0c
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimplePartitionReader.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimplePartitionReaderFactory.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimplePartitionReaderFactory.class
new file mode 100644
index 00000000..0ae0a7c6
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimplePartitionReaderFactory.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleScan.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleScan.class
new file mode 100644
index 00000000..a0c7f5c3
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleScan.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleScanBuilder.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleScanBuilder.class
new file mode 100644
index 00000000..a4fde431
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleScanBuilder.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleStreamingTable.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleStreamingTable.class
new file mode 100644
index 00000000..348c8c76
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streamandbatch/SimpleStreamingTable.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/DataSourceV2StreamingExample$.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/DataSourceV2StreamingExample$.class
new file mode 100644
index 00000000..24661f2d
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/DataSourceV2StreamingExample$.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/DataSourceV2StreamingExample.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/DataSourceV2StreamingExample.class
new file mode 100644
index 00000000..b7f93ada
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/DataSourceV2StreamingExample.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/DefaultSource.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/DefaultSource.class
new file mode 100644
index 00000000..1d84d959
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/DefaultSource.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimpleMicroBatchStream.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimpleMicroBatchStream.class
new file mode 100644
index 00000000..e6ad3411
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimpleMicroBatchStream.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimpleOffset.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimpleOffset.class
new file mode 100644
index 00000000..30536a2a
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimpleOffset.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimplePartition.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimplePartition.class
new file mode 100644
index 00000000..cc94484e
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimplePartition.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimplePartitionReader.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimplePartitionReader.class
new file mode 100644
index 00000000..e5ad1364
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimplePartitionReader.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimplePartitionReaderFactory.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimplePartitionReaderFactory.class
new file mode 100644
index 00000000..fd9b46c6
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimplePartitionReaderFactory.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimpleScan.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimpleScan.class
new file mode 100644
index 00000000..16565704
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimpleScan.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimpleScanBuilder.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimpleScanBuilder.class
new file mode 100644
index 00000000..9940bfc7
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimpleScanBuilder.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimpleStreamingTable.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimpleStreamingTable.class
new file mode 100644
index 00000000..d0851a90
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/datasourcev2/streaming/SimpleStreamingTable.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/ConnectionProperties$.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/ConnectionProperties$.class
new file mode 100644
index 00000000..082890ea
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/ConnectionProperties$.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/ConnectionProperties.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/ConnectionProperties.class
new file mode 100644
index 00000000..a1e5d720
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/ConnectionProperties.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/DefaultSource.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/DefaultSource.class
new file mode 100644
index 00000000..21559b2c
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/DefaultSource.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussBatchWrite.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussBatchWrite.class
new file mode 100644
index 00000000..e4c7d071
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussBatchWrite.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussDataWriterFactory.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussDataWriterFactory.class
new file mode 100644
index 00000000..bbb9fa09
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussDataWriterFactory.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussPartition.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussPartition.class
new file mode 100644
index 00000000..b5692a05
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussPartition.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussPartitionReader.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussPartitionReader.class
new file mode 100644
index 00000000..c371d270
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussPartitionReader.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussPartitionReaderFactory.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussPartitionReaderFactory.class
new file mode 100644
index 00000000..d740f1ea
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussPartitionReaderFactory.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussScan.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussScan.class
new file mode 100644
index 00000000..3d9a4cb4
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussScan.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussScanBuilder.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussScanBuilder.class
new file mode 100644
index 00000000..712efa27
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussScanBuilder.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussTable$.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussTable$.class
new file mode 100644
index 00000000..0d45edab
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussTable$.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussTable.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussTable.class
new file mode 100644
index 00000000..905a815e
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussTable.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussWriteBuilder.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussWriteBuilder.class
new file mode 100644
index 00000000..42858e7f
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussWriteBuilder.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussWriter.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussWriter.class
new file mode 100644
index 00000000..8c237066
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/OpenGaussWriter.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/WriteSucceeded$.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/WriteSucceeded$.class
new file mode 100644
index 00000000..d54d7813
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/WriteSucceeded$.class differ
diff --git a/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/WriteSucceeded.class b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/WriteSucceeded.class
new file mode 100644
index 00000000..3d770329
Binary files /dev/null and b/SparkOpOpenGauss/target/classes/org/opengauss/spark/sources/opengauss/WriteSucceeded.class differ
diff --git a/SparkOpOpenGauss/target/classes/sales.csv b/SparkOpOpenGauss/target/classes/sales.csv
new file mode 100644
index 00000000..b3145638
--- /dev/null
+++ b/SparkOpOpenGauss/target/classes/sales.csv
@@ -0,0 +1,15 @@
+transactionId,customerId,itemId,amountPaid
+111,1,1,100.0
+112,2,2,505.0
+113,3,3,510.0
+114,4,4,600.0
+115,1,2,500.0
+116,1,2,500.0
+117,1,2,500.0
+118,1,2,500.0
+119,2,3,500.0
+120,1,2,500.0
+121,1,4,500.0
+122,1,2,500.0
+123,1,4,500.0
+124,1,2,500.0
\ No newline at end of file
diff --git a/SparkOpOpenGauss/target/test-classes/org/opengauss/spark/OpenGaussExample$Queries$.class b/SparkOpOpenGauss/target/test-classes/org/opengauss/spark/OpenGaussExample$Queries$.class
new file mode 100644
index 00000000..3ca4fed0
Binary files /dev/null and b/SparkOpOpenGauss/target/test-classes/org/opengauss/spark/OpenGaussExample$Queries$.class differ
diff --git a/SparkOpOpenGauss/target/test-classes/org/opengauss/spark/OpenGaussExample.class b/SparkOpOpenGauss/target/test-classes/org/opengauss/spark/OpenGaussExample.class
new file mode 100644
index 00000000..741faac5
Binary files /dev/null and b/SparkOpOpenGauss/target/test-classes/org/opengauss/spark/OpenGaussExample.class differ