This is an automated email from the ASF dual-hosted git repository.
lzljs3620320 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/paimon-python.git
The following commit(s) were added to refs/heads/main by this push:
new a7b752a Refactoring module structure and building (#15)
a7b752a is described below
commit a7b752af57cc844a957bb6d6aaafba4eeaae0d38
Author: yuzelin <[email protected]>
AuthorDate: Wed Oct 9 10:45:54 2024 +0800
Refactoring module structure and building (#15)
---
.github/workflows/paimon-python-checks.yml | 10 ++++--
.gitignore | 2 +-
README.md | 30 ++++++++--------
paimon_python_api/__init__.py | 25 ++++++++++++++
paimon_python_api/catalog.py | 2 +-
paimon_python_api/read_builder.py | 3 +-
paimon_python_api/table.py | 3 +-
paimon_python_api/table_commit.py | 2 +-
paimon_python_api/table_read.py | 7 ++--
paimon_python_api/table_scan.py | 2 +-
paimon_python_api/table_write.py | 7 ++--
paimon_python_api/write_builder.py | 3 +-
.../util => paimon_python_java}/__init__.py | 19 ++++++++++
.../gateway_server.py | 30 ++++++++++++----
.../java_gateway.py | 8 ++---
.../paimon-python-java-bridge/copyright.txt | 0
.../paimon-python-java-bridge/pom.xml | 22 ++++++++++--
.../java/org/apache/paimon/python/BytesWriter.java | 0
.../java/org/apache/paimon/python/FileLock.java | 0
.../org/apache/paimon/python/InvocationUtil.java | 0
.../java/org/apache/paimon/python/NetUtils.java | 0
.../apache/paimon/python/ParallelBytesReader.java | 0
.../org/apache/paimon/python/PythonEnvUtils.java | 0
.../apache/paimon/python/PythonGatewayServer.java | 0
.../apache/paimon/python/RecordBytesIterator.java | 0
.../tools/maven/checkstyle.xml | 0
.../tools/maven/suppressions.xml | 0
.../api_impl.py => paimon_python_java/pypaimon.py | 27 +++++++--------
.../tests}/__init__.py | 0
.../tests/test_write_and_read.py | 13 +++----
.../tests/utils.py | 6 ++--
.../tests => paimon_python_java/util}/__init__.py | 0
.../util/constants.py | 1 -
.../util/exceptions.py | 0
.../util/java_utils.py | 2 +-
setup.py | 20 +++++++----
.../util => setup_utils}/__init__.py | 2 ++
.../java_setuputils.py | 40 ++++++++++------------
tox.ini | 1 +
39 files changed, 186 insertions(+), 101 deletions(-)
diff --git a/.github/workflows/paimon-python-checks.yml
b/.github/workflows/paimon-python-checks.yml
index 1e85b1b..e94820b 100644
--- a/.github/workflows/paimon-python-checks.yml
+++ b/.github/workflows/paimon-python-checks.yml
@@ -22,10 +22,11 @@ on:
push:
pull_request:
paths-ignore:
- - 'dev/**'
- - 'java_based_implementation/paimon-python-java-bridge/**'
- '**/*.md'
+env:
+ JDK_VERSION: 8
+
concurrency:
group: ${{ github.workflow }}-${{ github.event_name }}-${{
github.event.number || github.run_id }}
cancel-in-progress: true
@@ -37,6 +38,11 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v2
+ - name: Set up JDK ${{ env.JDK_VERSION }}
+ uses: actions/setup-java@v2
+ with:
+ java-version: ${{ env.JDK_VERSION }}
+ distribution: 'adopt'
- name: Run lint-python.sh
run: |
chmod +x dev/lint-python.sh
diff --git a/.gitignore b/.gitignore
index c84443a..08fac18 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,4 +15,4 @@ dev/.stage.txt
dev/download
dev/log
dist/
-paimon_python.egg-info/
+*.egg-info/
diff --git a/README.md b/README.md
index f605935..cd2d360 100644
--- a/README.md
+++ b/README.md
@@ -22,30 +22,28 @@ This repo is for Apache Paimon Python SDK.
You can verify the setup by right-clicking on any file or folder in the
flink-python project
and running "External Tools" → "flake8".
-# Usage
-
-## Java-Based Implementation
+## Check
-We can use `py4j` to leverage Java code to read Paimon data. This section
describes how to use this implementation.
+We provide script to check codes.
-### Set Environment Variables
+```shell
+./dev/lint-python.sh # execute all checks
+./dev/lint-python.sh -h # run this to see more usages
+```
-`py4j` need to access a JVM, so we should set JVM arguments (optional) and
Java classpath. A convenient way is using
-`os` packages to set environment variables which only affect current process.
+## Build
-```python
-import os
+We provide script to build wheel.
-os.environ['PYPAIMON_JAVA_CLASSPATH'] = '/path/to/dependent_jars/*'
-os.environ['_PYPAIMON_JVM_ARGS'] = 'jvm_arg1 jvm_arg2 ...'
+```shell
+./dev/build-wheels.sh
```
-NOTE: the package has set paimon core and hadoop dependencies. If you just
test in local or run code in hadoop, you doesn't
-need to set classpath. If you need other dependencies such as OSS/S3
filesystem jars, or special catalog which isn't implemented
-in paimon core, please download jars and set classpath.
+The target wheel is under `dist/`
+
+# Usage
-# API Reference
-TODO
+See Apache Paimon Python API
[Doc](https://paimon.apache.org/docs/master/program-api/python-api/).
diff --git a/paimon_python_api/__init__.py b/paimon_python_api/__init__.py
index e154fad..b3842d0 100644
--- a/paimon_python_api/__init__.py
+++ b/paimon_python_api/__init__.py
@@ -15,3 +15,28 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#################################################################################
+
+from .split import Split
+from .table_read import TableRead
+from .table_scan import TableScan, Plan
+from .read_builder import ReadBuilder
+from .commit_message import CommitMessage
+from .table_commit import BatchTableCommit
+from .table_write import BatchTableWrite
+from .write_builder import BatchWriteBuilder
+from .table import Table
+from .catalog import Catalog
+
+__all__ = [
+ 'Split',
+ 'TableRead',
+ 'TableScan',
+ 'Plan',
+ 'ReadBuilder',
+ 'CommitMessage',
+ 'BatchTableCommit',
+ 'BatchTableWrite',
+ 'BatchWriteBuilder',
+ 'Table',
+ 'Catalog'
+]
diff --git a/paimon_python_api/catalog.py b/paimon_python_api/catalog.py
index 7fbacc5..412e9f0 100644
--- a/paimon_python_api/catalog.py
+++ b/paimon_python_api/catalog.py
@@ -17,7 +17,7 @@
#################################################################################
from abc import ABC, abstractmethod
-from paimon_python_api.table import Table
+from paimon_python_api import Table
class Catalog(ABC):
diff --git a/paimon_python_api/read_builder.py
b/paimon_python_api/read_builder.py
index bc4266d..94ec073 100644
--- a/paimon_python_api/read_builder.py
+++ b/paimon_python_api/read_builder.py
@@ -17,8 +17,7 @@
#################################################################################
from abc import ABC, abstractmethod
-from paimon_python_api.table_read import TableRead
-from paimon_python_api.table_scan import TableScan
+from paimon_python_api import TableRead, TableScan
from typing import List
diff --git a/paimon_python_api/table.py b/paimon_python_api/table.py
index e1bacd7..35b81ac 100644
--- a/paimon_python_api/table.py
+++ b/paimon_python_api/table.py
@@ -17,8 +17,7 @@
#################################################################################
from abc import ABC, abstractmethod
-from paimon_python_api.read_builder import ReadBuilder
-from paimon_python_api.write_builder import BatchWriteBuilder
+from paimon_python_api import ReadBuilder, BatchWriteBuilder
class Table(ABC):
diff --git a/paimon_python_api/table_commit.py
b/paimon_python_api/table_commit.py
index 517b66e..d76ed6a 100644
--- a/paimon_python_api/table_commit.py
+++ b/paimon_python_api/table_commit.py
@@ -17,7 +17,7 @@
#################################################################################
from abc import ABC, abstractmethod
-from paimon_python_api.commit_message import CommitMessage
+from paimon_python_api import CommitMessage
from typing import List
diff --git a/paimon_python_api/table_read.py b/paimon_python_api/table_read.py
index 47b8aae..4fa12c1 100644
--- a/paimon_python_api/table_read.py
+++ b/paimon_python_api/table_read.py
@@ -16,9 +16,10 @@
# limitations under the License.
#################################################################################
+import pyarrow as pa
+
from abc import ABC, abstractmethod
-from pyarrow import RecordBatchReader
-from paimon_python_api.split import Split
+from paimon_python_api import Split
from typing import List
@@ -26,5 +27,5 @@ class TableRead(ABC):
"""To read data from data splits."""
@abstractmethod
- def create_reader(self, splits: List[Split]) -> RecordBatchReader:
+ def create_reader(self, splits: List[Split]) -> pa.RecordBatchReader:
"""Return a reader containing batches of pyarrow format."""
diff --git a/paimon_python_api/table_scan.py b/paimon_python_api/table_scan.py
index 8e29c12..d998462 100644
--- a/paimon_python_api/table_scan.py
+++ b/paimon_python_api/table_scan.py
@@ -18,7 +18,7 @@
from abc import ABC, abstractmethod
from typing import List
-from paimon_python_api.split import Split
+from paimon_python_api import Split
class TableScan(ABC):
diff --git a/paimon_python_api/table_write.py b/paimon_python_api/table_write.py
index d0052a1..167ceeb 100644
--- a/paimon_python_api/table_write.py
+++ b/paimon_python_api/table_write.py
@@ -16,9 +16,10 @@
# limitations under the License.
#################################################################################
+import pyarrow as pa
+
from abc import ABC, abstractmethod
-from paimon_python_api.commit_message import CommitMessage
-from pyarrow import RecordBatch
+from paimon_python_api import CommitMessage
from typing import List
@@ -26,7 +27,7 @@ class BatchTableWrite(ABC):
"""A table write for batch processing. Recommended for one-time
committing."""
@abstractmethod
- def write(self, record_batch: RecordBatch):
+ def write(self, record_batch: pa.RecordBatch):
""" Write a batch to the writer. */"""
@abstractmethod
diff --git a/paimon_python_api/write_builder.py
b/paimon_python_api/write_builder.py
index b36fdbe..caa23b9 100644
--- a/paimon_python_api/write_builder.py
+++ b/paimon_python_api/write_builder.py
@@ -17,8 +17,7 @@
#################################################################################
from abc import ABC, abstractmethod
-from paimon_python_api.table_commit import BatchTableCommit
-from paimon_python_api.table_write import BatchTableWrite
+from paimon_python_api import BatchTableCommit, BatchTableWrite
class BatchWriteBuilder(ABC):
diff --git a/java_based_implementation/util/__init__.py
b/paimon_python_java/__init__.py
similarity index 68%
copy from java_based_implementation/util/__init__.py
copy to paimon_python_java/__init__.py
index 65b48d4..6e97d9e 100644
--- a/java_based_implementation/util/__init__.py
+++ b/paimon_python_java/__init__.py
@@ -15,3 +15,22 @@
# See the License for the specific language governing permissions and
# limitations under the License.
################################################################################
+
+from .util import constants
+from .pypaimon import (Catalog, Table, ReadBuilder, TableScan, Plan, Split,
TableRead,
+ BatchWriteBuilder, BatchTableWrite, CommitMessage,
BatchTableCommit)
+
+__all__ = [
+ 'constants',
+ 'Catalog',
+ 'Table',
+ 'ReadBuilder',
+ 'TableScan',
+ 'Plan',
+ 'Split',
+ 'TableRead',
+ 'BatchWriteBuilder',
+ 'BatchTableWrite',
+ 'CommitMessage',
+ 'BatchTableCommit'
+]
diff --git a/java_based_implementation/gateway_server.py
b/paimon_python_java/gateway_server.py
similarity index 74%
rename from java_based_implementation/gateway_server.py
rename to paimon_python_java/gateway_server.py
index 60940a5..31933e2 100644
--- a/java_based_implementation/gateway_server.py
+++ b/paimon_python_java/gateway_server.py
@@ -16,14 +16,13 @@
# limitations under the License.
################################################################################
+import importlib
import os
import platform
import signal
from subprocess import Popen, PIPE
-from java_based_implementation.util.constants import (PYPAIMON_JVM_ARGS,
PYPAIMON_MAIN_ARGS,
- PYPAIMON_MAIN_CLASS)
-from java_based_implementation.util.setup_utils import get_classpath
+from paimon_python_java import constants
def on_windows():
@@ -47,9 +46,9 @@ def launch_gateway_server_process(env):
java_executable = find_java_executable()
# TODO construct Java module log settings
log_settings = []
- jvm_args = env.get(PYPAIMON_JVM_ARGS, '').split()
- classpath = get_classpath(env)
- main_args = env.get(PYPAIMON_MAIN_ARGS, '').split()
+ jvm_args = env.get(constants.PYPAIMON_JVM_ARGS, '').split()
+ classpath = _get_classpath(env)
+ main_args = env.get(constants.PYPAIMON_MAIN_ARGS, '').split()
command = [
java_executable,
*jvm_args,
@@ -60,7 +59,7 @@ def launch_gateway_server_process(env):
"-cp",
classpath,
"-c",
- PYPAIMON_MAIN_CLASS,
+ constants.PYPAIMON_MAIN_CLASS,
*main_args
]
@@ -72,3 +71,20 @@ def launch_gateway_server_process(env):
preexec_fn = preexec_func
return Popen(list(filter(lambda c: len(c) != 0, command)),
stdin=PIPE, stderr=PIPE, preexec_fn=preexec_fn, env=env)
+
+
+_JAVA_IMPL_MODULE = 'paimon_python_java'
+_JAVA_DEPS = 'java_dependencies'
+_JAVA_BRIDGE = 'paimon-python-java-bridge'
+
+
+def _get_classpath(env):
+ user_defined = env.get(constants.PYPAIMON_JAVA_CLASSPATH)
+
+ module = importlib.import_module(_JAVA_IMPL_MODULE)
+ builtin_java_bridge = os.path.join(*module.__path__, _JAVA_DEPS,
_JAVA_BRIDGE + '.jar')
+
+ if user_defined is None:
+ return builtin_java_bridge
+ else:
+ return os.pathsep.join([builtin_java_bridge, user_defined])
diff --git a/java_based_implementation/java_gateway.py
b/paimon_python_java/java_gateway.py
similarity index 93%
rename from java_based_implementation/java_gateway.py
rename to paimon_python_java/java_gateway.py
index 64f40b4..372ae4a 100644
--- a/java_based_implementation/java_gateway.py
+++ b/paimon_python_java/java_gateway.py
@@ -26,9 +26,9 @@ from py4j.java_gateway import (java_import, logger,
JavaGateway, GatewayParamete
CallbackServerParameters)
from threading import RLock
-from java_based_implementation.gateway_server import
launch_gateway_server_process
-from java_based_implementation.util.constants import PYPAIMON_CONN_INFO_PATH
-from java_based_implementation.util.exceptions import install_py4j_hooks
+from paimon_python_java.gateway_server import launch_gateway_server_process
+from paimon_python_java import constants
+from paimon_python_java.util.exceptions import install_py4j_hooks
_gateway = None
_lock = RLock()
@@ -73,7 +73,7 @@ def launch_gateway():
os.unlink(conn_info_file)
env = dict(os.environ)
- env[PYPAIMON_CONN_INFO_PATH] = conn_info_file
+ env[constants.PYPAIMON_CONN_INFO_PATH] = conn_info_file
p = launch_gateway_server_process(env)
diff --git a/java_based_implementation/paimon-python-java-bridge/copyright.txt
b/paimon_python_java/paimon-python-java-bridge/copyright.txt
similarity index 100%
rename from java_based_implementation/paimon-python-java-bridge/copyright.txt
rename to paimon_python_java/paimon-python-java-bridge/copyright.txt
diff --git a/java_based_implementation/paimon-python-java-bridge/pom.xml
b/paimon_python_java/paimon-python-java-bridge/pom.xml
similarity index 87%
rename from java_based_implementation/paimon-python-java-bridge/pom.xml
rename to paimon_python_java/paimon-python-java-bridge/pom.xml
index 5eb26e1..7fe5858 100644
--- a/java_based_implementation/paimon-python-java-bridge/pom.xml
+++ b/paimon_python_java/paimon-python-java-bridge/pom.xml
@@ -23,13 +23,13 @@
<groupId>org.apache.paimon</groupId>
<artifactId>paimon-python-java-bridge</artifactId>
- <version>0.9-SNAPSHOT</version>
+ <version>0.1-SNAPSHOT</version>
<name>Paimon : Python-Java Bridge</name>
<packaging>jar</packaging>
<properties>
- <paimon.version>0.9-SNAPSHOT</paimon.version>
+ <paimon.version>0.9.0</paimon.version>
<flink.shaded.hadoop.version>2.8.3-10.0</flink.shaded.hadoop.version>
<py4j.version>0.10.9.7</py4j.version>
<slf4j.version>1.7.32</slf4j.version>
@@ -37,6 +37,7 @@
<spotless.version>2.13.0</spotless.version>
<spotless.delimiter>package</spotless.delimiter>
<arrow.version>14.0.0</arrow.version>
+ <target.java.version>1.8</target.java.version>
</properties>
<dependencies>
@@ -137,6 +138,23 @@
</executions>
</plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.8.0</version>
+ <configuration>
+ <source>${target.java.version}</source>
+ <target>${target.java.version}</target>
+ <!-- The semantics of this option are reversed, see
MCOMPILER-209. -->
+
<useIncrementalCompilation>false</useIncrementalCompilation>
+ <compilerArgs>
+ <!-- Prevents recompilation due to missing
package-info.class, see MCOMPILER-205 -->
+ <arg>-Xpkginfo:always</arg>
+ <arg>-Xlint:deprecation</arg>
+ </compilerArgs>
+ </configuration>
+ </plugin>
+
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
diff --git
a/java_based_implementation/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/BytesWriter.java
b/paimon_python_java/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/BytesWriter.java
similarity index 100%
rename from
java_based_implementation/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/BytesWriter.java
rename to
paimon_python_java/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/BytesWriter.java
diff --git
a/java_based_implementation/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/FileLock.java
b/paimon_python_java/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/FileLock.java
similarity index 100%
rename from
java_based_implementation/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/FileLock.java
rename to
paimon_python_java/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/FileLock.java
diff --git
a/java_based_implementation/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/InvocationUtil.java
b/paimon_python_java/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/InvocationUtil.java
similarity index 100%
rename from
java_based_implementation/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/InvocationUtil.java
rename to
paimon_python_java/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/InvocationUtil.java
diff --git
a/java_based_implementation/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/NetUtils.java
b/paimon_python_java/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/NetUtils.java
similarity index 100%
rename from
java_based_implementation/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/NetUtils.java
rename to
paimon_python_java/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/NetUtils.java
diff --git
a/java_based_implementation/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/ParallelBytesReader.java
b/paimon_python_java/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/ParallelBytesReader.java
similarity index 100%
rename from
java_based_implementation/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/ParallelBytesReader.java
rename to
paimon_python_java/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/ParallelBytesReader.java
diff --git
a/java_based_implementation/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/PythonEnvUtils.java
b/paimon_python_java/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/PythonEnvUtils.java
similarity index 100%
rename from
java_based_implementation/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/PythonEnvUtils.java
rename to
paimon_python_java/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/PythonEnvUtils.java
diff --git
a/java_based_implementation/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/PythonGatewayServer.java
b/paimon_python_java/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/PythonGatewayServer.java
similarity index 100%
rename from
java_based_implementation/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/PythonGatewayServer.java
rename to
paimon_python_java/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/PythonGatewayServer.java
diff --git
a/java_based_implementation/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/RecordBytesIterator.java
b/paimon_python_java/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/RecordBytesIterator.java
similarity index 100%
rename from
java_based_implementation/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/RecordBytesIterator.java
rename to
paimon_python_java/paimon-python-java-bridge/src/main/java/org/apache/paimon/python/RecordBytesIterator.java
diff --git
a/java_based_implementation/paimon-python-java-bridge/tools/maven/checkstyle.xml
b/paimon_python_java/paimon-python-java-bridge/tools/maven/checkstyle.xml
similarity index 100%
rename from
java_based_implementation/paimon-python-java-bridge/tools/maven/checkstyle.xml
rename to
paimon_python_java/paimon-python-java-bridge/tools/maven/checkstyle.xml
diff --git
a/java_based_implementation/paimon-python-java-bridge/tools/maven/suppressions.xml
b/paimon_python_java/paimon-python-java-bridge/tools/maven/suppressions.xml
similarity index 100%
rename from
java_based_implementation/paimon-python-java-bridge/tools/maven/suppressions.xml
rename to
paimon_python_java/paimon-python-java-bridge/tools/maven/suppressions.xml
diff --git a/java_based_implementation/api_impl.py
b/paimon_python_java/pypaimon.py
similarity index 89%
rename from java_based_implementation/api_impl.py
rename to paimon_python_java/pypaimon.py
index 05487f4..ee43a17 100644
--- a/java_based_implementation/api_impl.py
+++ b/paimon_python_java/pypaimon.py
@@ -16,13 +16,12 @@
# limitations under the License.
################################################################################
-from java_based_implementation.java_gateway import get_gateway
-from java_based_implementation.util import constants
-from java_based_implementation.util.java_utils import to_j_catalog_context,
check_batch_write
+import pyarrow as pa
+
+from paimon_python_java.java_gateway import get_gateway
+from paimon_python_java.util import java_utils, constants
from paimon_python_api import (catalog, table, read_builder, table_scan,
split, table_read,
write_builder, table_write, commit_message,
table_commit)
-from pyarrow import (RecordBatch, BufferOutputStream, RecordBatchStreamWriter,
- RecordBatchStreamReader, BufferReader, RecordBatchReader)
from typing import List, Iterator
@@ -34,7 +33,7 @@ class Catalog(catalog.Catalog):
@staticmethod
def create(catalog_options: dict) -> 'Catalog':
- j_catalog_context = to_j_catalog_context(catalog_options)
+ j_catalog_context = java_utils.to_j_catalog_context(catalog_options)
gateway = get_gateway()
j_catalog = gateway.jvm.CatalogFactory.createCatalog(j_catalog_context)
return Catalog(j_catalog, catalog_options)
@@ -57,7 +56,7 @@ class Table(table.Table):
return ReadBuilder(j_read_builder, self._j_table.rowType(),
self._catalog_options)
def new_batch_write_builder(self) -> 'BatchWriteBuilder':
- check_batch_write(self._j_table)
+ java_utils.check_batch_write(self._j_table)
j_batch_write_builder =
get_gateway().jvm.InvocationUtil.getBatchWriteBuilder(self._j_table)
return BatchWriteBuilder(j_batch_write_builder,
self._j_table.rowType())
@@ -129,7 +128,7 @@ class TableRead(table_read.TableRead):
j_splits = list(map(lambda s: s.to_j_split(), splits))
self._j_bytes_reader.setSplits(j_splits)
batch_iterator = self._batch_generator()
- return RecordBatchReader.from_batches(self._arrow_schema,
batch_iterator)
+ return pa.RecordBatchReader.from_batches(self._arrow_schema,
batch_iterator)
def _init(self):
if self._j_bytes_reader is None:
@@ -147,17 +146,17 @@ class TableRead(table_read.TableRead):
if self._arrow_schema is None:
schema_bytes = self._j_bytes_reader.serializeSchema()
- schema_reader = RecordBatchStreamReader(BufferReader(schema_bytes))
+ schema_reader =
pa.RecordBatchStreamReader(pa.BufferReader(schema_bytes))
self._arrow_schema = schema_reader.schema
schema_reader.close()
- def _batch_generator(self) -> Iterator[RecordBatch]:
+ def _batch_generator(self) -> Iterator[pa.RecordBatch]:
while True:
next_bytes = self._j_bytes_reader.next()
if next_bytes is None:
break
else:
- stream_reader =
RecordBatchStreamReader(BufferReader(next_bytes))
+ stream_reader =
pa.RecordBatchStreamReader(pa.BufferReader(next_bytes))
yield from stream_reader
@@ -187,9 +186,9 @@ class BatchTableWrite(table_write.BatchTableWrite):
self._j_bytes_writer =
get_gateway().jvm.InvocationUtil.createBytesWriter(
j_batch_table_write, j_row_type)
- def write(self, record_batch: RecordBatch):
- stream = BufferOutputStream()
- with RecordBatchStreamWriter(stream, record_batch.schema) as writer:
+ def write(self, record_batch: pa.RecordBatch):
+ stream = pa.BufferOutputStream()
+ with pa.RecordBatchStreamWriter(stream, record_batch.schema) as writer:
writer.write(record_batch)
writer.close()
arrow_bytes = stream.getvalue().to_pybytes()
diff --git a/java_based_implementation/__init__.py
b/paimon_python_java/tests/__init__.py
similarity index 100%
rename from java_based_implementation/__init__.py
rename to paimon_python_java/tests/__init__.py
diff --git a/java_based_implementation/tests/test_write_and_read.py
b/paimon_python_java/tests/test_write_and_read.py
similarity index 96%
rename from java_based_implementation/tests/test_write_and_read.py
rename to paimon_python_java/tests/test_write_and_read.py
index 0ea834e..19c9ea8 100644
--- a/java_based_implementation/tests/test_write_and_read.py
+++ b/paimon_python_java/tests/test_write_and_read.py
@@ -20,11 +20,12 @@ import tempfile
import unittest
import pandas as pd
import pyarrow as pa
+import setup_utils.java_setuputils as setuputils
-from java_based_implementation.api_impl import Catalog, Table
-from java_based_implementation.java_gateway import get_gateway
-from java_based_implementation.tests.utils import create_simple_table
-from java_based_implementation.util import java_utils, setup_utils
+from paimon_python_java import Catalog, Table
+from paimon_python_java.java_gateway import get_gateway
+from paimon_python_java.tests.utils import create_simple_table
+from paimon_python_java.util import java_utils
from py4j.protocol import Py4JJavaError
@@ -32,12 +33,12 @@ class TableWriteReadTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
- setup_utils.setup_java_bridge()
+ setuputils.setup_java_bridge()
cls.warehouse = tempfile.mkdtemp()
@classmethod
def tearDownClass(cls):
- setup_utils.clean()
+ setuputils.clean()
def testReadEmptyAppendTable(self):
create_simple_table(self.warehouse, 'default', 'empty_append_table',
False)
diff --git a/java_based_implementation/tests/utils.py
b/paimon_python_java/tests/utils.py
similarity index 89%
rename from java_based_implementation/tests/utils.py
rename to paimon_python_java/tests/utils.py
index e709e0a..e0a79d5 100644
--- a/java_based_implementation/tests/utils.py
+++ b/paimon_python_java/tests/utils.py
@@ -16,8 +16,8 @@
# limitations under the License.
################################################################################
-from java_based_implementation.java_gateway import get_gateway
-from java_based_implementation.util.java_utils import to_j_catalog_context
+from paimon_python_java.java_gateway import get_gateway
+from paimon_python_java.util import java_utils
def create_simple_table(warehouse, database, table_name, has_pk, options=None):
@@ -29,7 +29,7 @@ def create_simple_table(warehouse, database, table_name,
has_pk, options=None):
gateway = get_gateway()
- j_catalog_context = to_j_catalog_context({'warehouse': warehouse})
+ j_catalog_context = java_utils.to_j_catalog_context({'warehouse':
warehouse})
j_catalog = gateway.jvm.CatalogFactory.createCatalog(j_catalog_context)
j_schema_builder = (
diff --git a/java_based_implementation/tests/__init__.py
b/paimon_python_java/util/__init__.py
similarity index 100%
rename from java_based_implementation/tests/__init__.py
rename to paimon_python_java/util/__init__.py
diff --git a/java_based_implementation/util/constants.py
b/paimon_python_java/util/constants.py
similarity index 97%
rename from java_based_implementation/util/constants.py
rename to paimon_python_java/util/constants.py
index 7e8923a..00f419c 100644
--- a/java_based_implementation/util/constants.py
+++ b/paimon_python_java/util/constants.py
@@ -22,7 +22,6 @@ PYPAIMON_JVM_ARGS = '_PYPAIMON_JVM_ARGS'
PYPAIMON_JAVA_CLASSPATH = '_PYPAIMON_JAVA_CLASSPATH'
PYPAIMON_MAIN_CLASS = 'org.apache.paimon.python.PythonGatewayServer'
PYPAIMON_MAIN_ARGS = '_PYPAIMON_MAIN_ARGS'
-PYPAIMON_TOX_TEST = '_PYPAIMON_TOX_TEST'
# ------------------------ for catalog options ------------------------
MAX_WORKERS = "max-workers"
diff --git a/java_based_implementation/util/exceptions.py
b/paimon_python_java/util/exceptions.py
similarity index 100%
rename from java_based_implementation/util/exceptions.py
rename to paimon_python_java/util/exceptions.py
diff --git a/java_based_implementation/util/java_utils.py
b/paimon_python_java/util/java_utils.py
similarity index 95%
rename from java_based_implementation/util/java_utils.py
rename to paimon_python_java/util/java_utils.py
index 1f0d1ec..6ce6ede 100644
--- a/java_based_implementation/util/java_utils.py
+++ b/paimon_python_java/util/java_utils.py
@@ -16,7 +16,7 @@
# limitations under the License.
################################################################################
-from java_based_implementation.java_gateway import get_gateway
+from paimon_python_java.java_gateway import get_gateway
def to_j_catalog_context(catalog_options: dict):
diff --git a/setup.py b/setup.py
index de23c21..2795cad 100644
--- a/setup.py
+++ b/setup.py
@@ -17,9 +17,10 @@
################################################################################
import fnmatch
-import java_based_implementation.util.setup_utils
+import io
import os
import shutil
+import setup_utils.java_setuputils as java_setuputils
from setuptools import Command, setup
@@ -50,12 +51,12 @@ class CleanCommand(Command):
try:
PACKAGES = [
'paimon_python_api',
- 'java_based_implementation',
- 'java_based_implementation.util'
+ 'paimon_python_java',
+ 'paimon_python_java.util'
]
PACKAGE_DATA = {
- 'java_based_implementation':
java_based_implementation.util.setup_utils.get_package_data()
+ 'paimon_python_java': java_setuputils.get_package_data()
}
install_requires = [
@@ -67,20 +68,25 @@ try:
'pyarrow>=5.0.0'
]
+ with io.open('README.md', 'r', encoding='utf-8') as f:
+ long_description = f.read()
+
setup(
name='paimon_python',
- version='0.9.0.dev1',
+ version='0.1.0.dev0',
packages=PACKAGES,
include_package_data=True,
package_data=PACKAGE_DATA,
cmdclass={'clean': CleanCommand},
install_requires=install_requires,
description='Apache Paimon Python API',
+ long_description=long_description,
+ long_description_content_type='text/markdown',
author='Apache Software Foundation',
author_email='[email protected]',
url='https://paimon.apache.org',
classifiers=[
- 'Development Status :: 5 - Production/Stable',
+ 'Development Status :: 4 - Beta',
'License :: OSI Approved :: Apache Software License',
'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9',
@@ -89,4 +95,4 @@ try:
python_requires='>=3.8'
)
finally:
- java_based_implementation.util.setup_utils.clean()
+ java_setuputils.clean()
diff --git a/java_based_implementation/util/__init__.py
b/setup_utils/__init__.py
similarity index 93%
rename from java_based_implementation/util/__init__.py
rename to setup_utils/__init__.py
index 65b48d4..27dc0ac 100644
--- a/java_based_implementation/util/__init__.py
+++ b/setup_utils/__init__.py
@@ -15,3 +15,5 @@
# See the License for the specific language governing permissions and
# limitations under the License.
################################################################################
+
+"""This module only contains utils for setup and won't be packaged."""
diff --git a/java_based_implementation/util/setup_utils.py
b/setup_utils/java_setuputils.py
old mode 100644
new mode 100755
similarity index 71%
rename from java_based_implementation/util/setup_utils.py
rename to setup_utils/java_setuputils.py
index ec5e367..49e2ea9
--- a/java_based_implementation/util/setup_utils.py
+++ b/setup_utils/java_setuputils.py
@@ -16,23 +16,21 @@
# limitations under the License.
################################################################################
-import importlib
import os
import shutil
import subprocess
-from java_based_implementation.util import constants
-from java_based_implementation.util.constants import PYPAIMON_JAVA_CLASSPATH
+from xml.etree import ElementTree
-_JAVA_IMPL_MODULE = 'java_based_implementation'
+_JAVA_IMPL_MODULE = 'paimon_python_java'
_JAVA_DEPS = 'java_dependencies'
_JAVA_BRIDGE = 'paimon-python-java-bridge'
-# TODO configure version
-_JAVA_BRIDGE_VERSION = '0.9-SNAPSHOT'
+
+_PYPAIMON_TOX_TEST = '_PYPAIMON_TOX_TEST'
def get_package_data():
- is_tox_test = os.environ.get(constants.PYPAIMON_TOX_TEST)
+ is_tox_test = os.environ.get(_PYPAIMON_TOX_TEST)
if is_tox_test and is_tox_test.lower() == "true":
return ['']
@@ -46,18 +44,6 @@ def clean():
shutil.rmtree(java_deps_dir)
-def get_classpath(env):
- user_defined = env.get(PYPAIMON_JAVA_CLASSPATH)
-
- module = importlib.import_module(_JAVA_IMPL_MODULE)
- builtin_java_bridge = os.path.join(*module.__path__, _JAVA_DEPS,
_JAVA_BRIDGE + '.jar')
-
- if user_defined is None:
- return builtin_java_bridge
- else:
- return os.pathsep.join([builtin_java_bridge, user_defined])
-
-
def setup_java_bridge():
java_impl_dir = _find_java_impl_dir()
@@ -79,11 +65,21 @@ def setup_java_bridge():
shutil.copy(
os.path.join(java_bridge_module, 'target/{}-{}.jar'
- .format(_JAVA_BRIDGE, _JAVA_BRIDGE_VERSION)),
+ .format(_JAVA_BRIDGE, _extract_bridge_version())),
java_bridge_dst
)
+def _extract_bridge_version():
+ pom_path = os.path.join(_find_java_impl_dir(), _JAVA_BRIDGE, 'pom.xml')
+ return ElementTree.parse(pom_path).getroot().find(
+ 'POM:version',
+ namespaces={
+ 'POM': 'http://maven.apache.org/POM/4.0.0'
+ }).text
+
+
def _find_java_impl_dir():
- abspath = os.path.abspath(__file__)
- return os.path.dirname(os.path.dirname(abspath))
+ this_dir = os.path.abspath(os.path.dirname(__file__))
+ paimon_python_dir = os.path.dirname(this_dir)
+ return os.path.join(paimon_python_dir, _JAVA_IMPL_MODULE)
diff --git a/tox.ini b/tox.ini
index 562364e..da9b377 100644
--- a/tox.ini
+++ b/tox.ini
@@ -28,6 +28,7 @@ whitelist_externals=
/bin/bash
deps =
-r dev/dev-requirements.txt
+ -e .
passenv = *
commands =
python --version