fabricks 3.0.3__py3-none-any.whl → 3.0.4__py3-none-any.whl

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.
@@ -37,6 +37,10 @@ class Configurator(ABC):
37
37
  def is_registered(self):
38
38
  return self.table.is_registered
39
39
 
40
+ @property
41
+ def qualified_name(self):
42
+ return f"{self.database}_{'_'.join(self.levels)}"
43
+
40
44
  @abstractmethod
41
45
  def get_query(self, src: Union[DataFrame, Table, str], **kwargs):
42
46
  raise NotImplementedError()
@@ -101,7 +101,7 @@ class Merger(Processor):
101
101
  self.create_table(src, **kwargs)
102
102
 
103
103
  df = self.get_data(src, **kwargs)
104
- global_temp_view = f"{self.database}_{'_'.join(self.levels)}__merge"
104
+ global_temp_view = f"{self.qualified_name}__merge"
105
105
  view = create_or_replace_global_temp_view(global_temp_view, df, uuid=kwargs.get("uuid", False))
106
106
 
107
107
  merge = self.get_merge_query(view, **kwargs)
@@ -16,7 +16,7 @@ from fabricks.utils.sqlglot import fix as fix_sql
16
16
  class Processor(Generator):
17
17
  def get_data(self, src: Union[DataFrame, Table, str], **kwargs) -> DataFrame:
18
18
  if isinstance(src, (DataFrame, CDataFrame)):
19
- name = f"{self.database}_{'_'.join(self.levels)}__data"
19
+ name = f"{self.qualified_name}__data"
20
20
  global_temp_view = create_or_replace_global_temp_view(name, src, uuid=kwargs.get("uuid", False))
21
21
  src = f"select * from {global_temp_view}"
22
22
 
@@ -347,8 +347,11 @@ class Processor(Generator):
347
347
  df = self.get_data(src, **kwargs)
348
348
  df = self.reorder_columns(df)
349
349
 
350
+ name = f"{self.qualified_name}__append"
351
+ create_or_replace_global_temp_view(name, df, uuid=kwargs.get("uuid", False))
352
+
350
353
  DEFAULT_LOGGER.debug("append", extra={"job": self})
351
- df.write.format("delta").mode("append").save(self.table.delta_path.string)
354
+ self.spark.sql(f"insert into table {self.table} by name select * from global_temp.{name}")
352
355
 
353
356
  def overwrite(
354
357
  self,
@@ -366,9 +369,11 @@ class Processor(Generator):
366
369
  if kwargs.get("update_where"):
367
370
  dynamic = True
368
371
 
369
- writer = df.write.format("delta").mode("overwrite")
370
372
  if dynamic:
371
- writer.option("partitionOverwriteMode", "dynamic")
373
+ self.spark.sql("set spark.sql.sources.partitionOverwriteMode = dynamic")
374
+
375
+ name = f"{self.qualified_name}__overwrite"
376
+ create_or_replace_global_temp_view(name, df, uuid=kwargs.get("uuid", False))
372
377
 
373
- DEFAULT_LOGGER.info("overwrite", extra={"job": self})
374
- writer.save(self.table.delta_path.string)
378
+ DEFAULT_LOGGER.debug("overwrite", extra={"job": self})
379
+ self.spark.sql(f"insert overwrite table {self.table} by name select * from global_temp.{name}")
@@ -1,5 +1,5 @@
1
1
  from dataclasses import dataclass
2
- from typing import Any, List, Literal, Optional, TypedDict, Union
2
+ from typing import List, Literal, Optional, TypedDict, Union
3
3
 
4
4
  from pydantic import BaseModel, ConfigDict, model_validator
5
5
  from pyspark.sql.types import StringType, StructField, StructType
@@ -33,8 +33,8 @@ Origins = Literal["parser", "job"]
33
33
 
34
34
 
35
35
  class SparkOptions(TypedDict):
36
- sql: Optional[dict[Any, Any]]
37
- conf: Optional[dict[Any, Any]]
36
+ sql: Optional[dict[str, str]]
37
+ conf: Optional[dict[str, str]]
38
38
 
39
39
 
40
40
  class TableOptions(TypedDict):
@@ -45,17 +45,17 @@ class TableOptions(TypedDict):
45
45
  cluster_by: Optional[List[str]]
46
46
  powerbi: Optional[bool]
47
47
  bloomfilter_by: Optional[List[str]]
48
- constraints: Optional[dict[Any, Any]]
49
- properties: Optional[dict[Any, Any]]
48
+ constraints: Optional[dict[str, str]]
49
+ properties: Optional[dict[str, str]]
50
50
  comment: Optional[str]
51
- calculated_columns: Optional[dict[Any, Any]]
51
+ calculated_columns: Optional[dict[str, str]]
52
52
  retention_days: Optional[int]
53
53
 
54
54
 
55
55
  class _InvokeOptions(TypedDict):
56
56
  notebook: str
57
57
  timeout: int
58
- arguments: Optional[dict[Any, Any]]
58
+ arguments: Optional[dict[str, str]]
59
59
 
60
60
 
61
61
  class InvokerOptions(TypedDict):
@@ -66,7 +66,7 @@ class InvokerOptions(TypedDict):
66
66
 
67
67
  class ExtenderOptions(TypedDict):
68
68
  extender: str
69
- arguments: Optional[dict[Any, Any]]
69
+ arguments: Optional[dict[str, str]]
70
70
 
71
71
 
72
72
  class CheckOptions(TypedDict):
@@ -90,7 +90,7 @@ class BronzeOptions(TypedDict):
90
90
  filter_where: Optional[str]
91
91
  # extra
92
92
  encrypted_columns: Optional[List[str]]
93
- calculated_columns: Optional[dict[Any, Any]]
93
+ calculated_columns: Optional[dict[str, str]]
94
94
  operation: Optional[Operations]
95
95
  timeout: Optional[int]
96
96
 
@@ -106,7 +106,7 @@ class SilverOptions(TypedDict):
106
106
  deduplicate: Optional[bool]
107
107
  stream: Optional[bool]
108
108
  # else
109
- order_duplicate_by: Optional[dict[Any, Any]]
109
+ order_duplicate_by: Optional[dict[str, str]]
110
110
  timeout: Optional[int]
111
111
 
112
112
 
@@ -141,7 +141,7 @@ class BaseJobConf:
141
141
 
142
142
  @dataclass
143
143
  class JobConfBronze(BaseJobConf):
144
- step: str
144
+ step: TBronze
145
145
  options: BronzeOptions
146
146
  table_options: Optional[TableOptions] = None
147
147
  parser_options: Optional[ParserOptions] = None
@@ -155,7 +155,7 @@ class JobConfBronze(BaseJobConf):
155
155
 
156
156
  @dataclass
157
157
  class JobConfSilver(BaseJobConf):
158
- step: str
158
+ step: TSilver
159
159
  options: SilverOptions
160
160
  table_options: Optional[TableOptions] = None
161
161
  check_options: Optional[CheckOptions] = None
@@ -168,7 +168,7 @@ class JobConfSilver(BaseJobConf):
168
168
 
169
169
  @dataclass
170
170
  class JobConfGold(BaseJobConf):
171
- step: str
171
+ step: TGold
172
172
  options: Optional[GoldOptions]
173
173
  table_options: Optional[TableOptions] = None
174
174
  check_options: Optional[CheckOptions] = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fabricks
3
- Version: 3.0.3
3
+ Version: 3.0.4
4
4
  Author-email: BMS DWH Team <bi_support@bmsuisse.ch>
5
5
  Requires-Python: <4,>=3.9
6
6
  Requires-Dist: azure-data-tables<13,>=12.5.0
@@ -37,10 +37,10 @@ fabricks/cdc/scd2.py,sha256=4vZkhc8pJAUlgiBmIw9j_2RsWuAFMcgCkU3WMVt0A-A,334
37
37
  fabricks/cdc/base/__init__.py,sha256=1uec9NHg3J5TWPMR09EsCMO1g8_3Dt6ZhC_b61Sg7JY,143
38
38
  fabricks/cdc/base/_types.py,sha256=IMI5bT4IFfqSnjTVrPBHsJkRXNdaRcMVUYW8qpfsTs0,82
39
39
  fabricks/cdc/base/cdc.py,sha256=9w5BqQxSVbFVEozJWmZQThqdppkE_SYi4fHSzJ7WMvA,78
40
- fabricks/cdc/base/configurator.py,sha256=aUHc1wSc738gEsYkTHP_d_PTxdZHKxw7hpH26d4Zu1A,5166
40
+ fabricks/cdc/base/configurator.py,sha256=fbQg4C1AH0BIis_Pdrv3BLkcjGnYOaCrxbjNc-95bj8,5269
41
41
  fabricks/cdc/base/generator.py,sha256=r_6S556wuNvl4eqo1L6-AfyPNj3mHQl8lTspWiFGFYU,6161
42
- fabricks/cdc/base/merger.py,sha256=p0VBVfE4i6xnxqL811Jp38vk45GAR5ip_Mlu8KU5188,4009
43
- fabricks/cdc/base/processor.py,sha256=8sFw2pOlHsDPhhZ0VIsYZjGrMK9HzVnLBOaNw0o6u7Y,13953
42
+ fabricks/cdc/base/merger.py,sha256=suule_MRyI-qXwBaUpKiBLmduZpvI01nwn6MBarkI24,3991
43
+ fabricks/cdc/base/processor.py,sha256=e0JKpz6sGGXvc6U6IFagxy8iZVtE3YAhfLP2mWXMiBs,14239
44
44
  fabricks/cdc/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
45
  fabricks/cdc/templates/filter.sql.jinja,sha256=H0-nAN7HzxDa3p_Qu2U_LeJnBCcBKR6xzIM0VnckeuQ,234
46
46
  fabricks/cdc/templates/merge.sql.jinja,sha256=iNpgqGiuI2QABmyTkHCibRr_5r7SASb3yqojhNP3e20,144
@@ -113,7 +113,7 @@ fabricks/core/jobs/get_jobs.py,sha256=5E1J95vFYDqa2n9DKpJn4ujD0MW-P38pNc6T6V8LDm
113
113
  fabricks/core/jobs/gold.py,sha256=EQ6nCNdvWTBt194tmXvMWZItw53o7x49nwJ4UiCSDH0,13996
114
114
  fabricks/core/jobs/silver.py,sha256=wn6c6hoeppjlWf6EutB_8qE5Sxu2PIWk5iQecRUuJ5o,13163
115
115
  fabricks/core/jobs/base/__init__.py,sha256=_AdWtyL7yZG2TOZ9e8WyNPrOjmm6EDkI_TNym5cLDws,208
116
- fabricks/core/jobs/base/_types.py,sha256=r_s1mG-kHErvC9tMX5ndNEgA_3ASD2ouEkYylbhe-18,6764
116
+ fabricks/core/jobs/base/_types.py,sha256=xNKHpzof_mPd97ytvk3wrPnXd1_VdLilh1yQgFF3Ois,6769
117
117
  fabricks/core/jobs/base/checker.py,sha256=LPK5f3ucT7T4Z7LjlOyHPXFfb94J_DdYVp6X85wIvDk,5324
118
118
  fabricks/core/jobs/base/configurator.py,sha256=ARj920yJJdNtD0Iz8IjbhSyJqlVrXzSz29n0mXofo-k,11569
119
119
  fabricks/core/jobs/base/exception.py,sha256=HrdxEuOfK5rY-ItZvEL3iywLgdpYUpmWFkjjjks7oYc,2318
@@ -171,6 +171,6 @@ fabricks/utils/schema/get_schema_for_type.py,sha256=u9FFYvWyq9VQdNJNu79-SCN9iGUB
171
171
  fabricks/utils/write/__init__.py,sha256=i0UnZenXj9Aq0b0_aU3s6882vg-Vu_AyKfQhl_dTp-g,200
172
172
  fabricks/utils/write/delta.py,sha256=mpaSxBNcl6N0QheGLx8rjeyWUvy1Yvvj4raGRv7GL5M,1229
173
173
  fabricks/utils/write/stream.py,sha256=wQBpAnQtYA6nl79sPKhVM6u5m-66suX7B6VQ6tW4TOs,622
174
- fabricks-3.0.3.dist-info/METADATA,sha256=dztXMj5CrebPZZmMtr-LdpcS2Zg6sO0x0OCUzwLik3s,682
175
- fabricks-3.0.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
176
- fabricks-3.0.3.dist-info/RECORD,,
174
+ fabricks-3.0.4.dist-info/METADATA,sha256=nFCQ4-fewJvmjPgINnMmf07MFDMOyMp8dVOFMd6Vbwo,682
175
+ fabricks-3.0.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
176
+ fabricks-3.0.4.dist-info/RECORD,,