duckrun 0.2.20.dev0__tar.gz → 0.2.20.dev1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/PKG-INFO +1 -1
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/ducklake_metadata.py +31 -13
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun.egg-info/PKG-INFO +1 -1
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/pyproject.toml +1 -1
- duckrun-0.2.20.dev1/tests/test_ducklake_export.py +4 -0
- duckrun-0.2.20.dev0/tests/test_ducklake_export.py +0 -7
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/LICENSE +0 -0
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/README.md +0 -0
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/__init__.py +0 -0
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/auth.py +0 -0
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/core.py +0 -0
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/files.py +0 -0
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/lakehouse.py +0 -0
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/notebook.py +0 -0
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/rle.py +0 -0
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/runner.py +0 -0
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/semantic_model.py +0 -0
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/stats.py +0 -0
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun/writer.py +0 -0
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun.egg-info/SOURCES.txt +0 -0
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun.egg-info/dependency_links.txt +0 -0
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun.egg-info/requires.txt +0 -0
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/duckrun.egg-info/top_level.txt +0 -0
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/setup.cfg +0 -0
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/tests/test_checkpoint_format.py +0 -0
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/tests/test_register.py +0 -0
- {duckrun-0.2.20.dev0 → duckrun-0.2.20.dev1}/tests/test_rle.py +0 -0
|
@@ -8,20 +8,21 @@ import shutil
|
|
|
8
8
|
|
|
9
9
|
def map_type_ducklake_to_spark(t):
|
|
10
10
|
"""Maps DuckDB data types to their Spark SQL equivalents for the Delta schema."""
|
|
11
|
-
|
|
12
|
-
if 'int' in
|
|
13
|
-
return 'long' if '64' in
|
|
14
|
-
elif 'float' in
|
|
11
|
+
t_lower = t.lower()
|
|
12
|
+
if 'int' in t_lower:
|
|
13
|
+
return 'long' if '64' in t_lower else 'integer'
|
|
14
|
+
elif 'float' in t_lower:
|
|
15
15
|
return 'double'
|
|
16
|
-
elif 'double' in
|
|
16
|
+
elif 'double' in t_lower:
|
|
17
17
|
return 'double'
|
|
18
|
-
elif 'decimal' in
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
elif 'decimal' in t_lower:
|
|
19
|
+
# Preserve the original decimal precision and scale
|
|
20
|
+
return t_lower
|
|
21
|
+
elif 'bool' in t_lower:
|
|
21
22
|
return 'boolean'
|
|
22
|
-
elif 'timestamp' in
|
|
23
|
+
elif 'timestamp' in t_lower:
|
|
23
24
|
return 'timestamp'
|
|
24
|
-
elif 'date' in
|
|
25
|
+
elif 'date' in t_lower:
|
|
25
26
|
return 'date'
|
|
26
27
|
return 'string'
|
|
27
28
|
|
|
@@ -42,14 +43,31 @@ def convert_stat_value_to_json(value_str, column_type):
|
|
|
42
43
|
column_type = column_type.lower()
|
|
43
44
|
|
|
44
45
|
try:
|
|
45
|
-
# Timestamp: Convert to ISO 8601 with .000Z suffix
|
|
46
|
+
# Timestamp: Convert to ISO 8601 with .000Z suffix (UTC format)
|
|
46
47
|
if 'timestamp' in column_type:
|
|
47
48
|
# Parse and format to ISO 8601
|
|
48
|
-
#
|
|
49
|
+
# Handle various input formats from DuckDB:
|
|
50
|
+
# - "2025-06-22 23:55:00" -> "2025-06-22T23:55:00.000Z"
|
|
51
|
+
# - "2025-06-22T23:55:00+00" -> "2025-06-22T23:55:00.000Z"
|
|
52
|
+
# - "2025-06-22T23:55:00.123+00:00" -> "2025-06-22T23:55:00.123Z"
|
|
53
|
+
|
|
54
|
+
# Replace space with T if needed
|
|
49
55
|
if 'T' not in value_str:
|
|
50
56
|
value_str = value_str.replace(' ', 'T')
|
|
57
|
+
|
|
58
|
+
# Remove timezone offset formats to normalize to UTC
|
|
59
|
+
# Strip patterns like: +00, +00:00, -05:00, etc.
|
|
60
|
+
import re
|
|
61
|
+
value_str = re.sub(r'[+-]\d{2}(?::\d{2})?$', '', value_str)
|
|
62
|
+
|
|
63
|
+
# Ensure milliseconds are present
|
|
64
|
+
if '.' not in value_str:
|
|
65
|
+
value_str += '.000'
|
|
66
|
+
|
|
67
|
+
# Add Z suffix for UTC if not present
|
|
51
68
|
if not value_str.endswith('Z'):
|
|
52
|
-
value_str += '
|
|
69
|
+
value_str += 'Z'
|
|
70
|
+
|
|
53
71
|
return value_str
|
|
54
72
|
|
|
55
73
|
# Date: Keep as YYYY-MM-DD string
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "duckrun"
|
|
7
|
-
version = "0.2.20.
|
|
7
|
+
version = "0.2.20.dev1"
|
|
8
8
|
description = "Helper library for Fabric Python using duckdb, arrow and delta_rs (orchestration, queries, etc.)"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = {text = "MIT"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|