Slackbot
07/12/2023, 11:27 PMElijah Ben Izzy
07/12/2023, 11:29 PMWentao Lu
07/12/2023, 11:30 PM@load_from.json("A")
@load_from.json("B")
def function(A, B):
Wentao Lu
07/12/2023, 11:30 PM.venv/lib/python3.9/site-packages/hamilton/function_modifiers/base.py:113: in __call__
raise ValueError(
E ValueError: Got multiple decorators for decorator @<class 'hamilton.function_modifiers.adapters.LoadFromDecorator'>. Only one allowed.
Wentao Lu
07/12/2023, 11:31 PMElijah Ben Izzy
07/12/2023, 11:31 PMElijah Ben Izzy
07/12/2023, 11:33 PMinject
variable — mind opening up a ticket?Elijah Ben Izzy
07/12/2023, 11:33 PMWentao Lu
07/12/2023, 11:34 PMWentao Lu
07/12/2023, 11:34 PMWentao Lu
07/12/2023, 11:34 PMElijah Ben Izzy
07/12/2023, 11:35 PMElijah Ben Izzy
07/12/2023, 11:35 PMWentao Lu
07/12/2023, 11:39 PMWentao Lu
07/12/2023, 11:40 PMWentao Lu
07/12/2023, 11:40 PMElijah Ben Izzy
07/12/2023, 11:40 PMWentao Lu
07/12/2023, 11:42 PMElijah Ben Izzy
07/12/2023, 11:45 PM@load_from.json(...)
def A(data) -> ...:
...
@load_from.json(...)
def B(data) -> ...:
return data
def function(A, B):
...
But yep, I’ll work on it soon 🙂.Wentao Lu
07/12/2023, 11:49 PMWentao Lu
07/12/2023, 11:49 PMElijah Ben Izzy
07/12/2023, 11:56 PMWentao Lu
07/13/2023, 12:03 AMWentao Lu
07/13/2023, 12:03 AMElijah Ben Izzy
07/13/2023, 12:07 AMElijah Ben Izzy
07/14/2023, 7:25 PMinject_
, basically what you specced out.
pip install git+<https://github.com/dagworks-inc/hamilton.git@multiple-load-from>
Otherwise I’ll plan to get it out in a new version shortly.Wentao Lu
07/14/2023, 11:14 PMWentao Lu
07/24/2023, 11:17 PMWentao Lu
07/24/2023, 11:17 PMe.__call__(self, fn)
111 if hasattr(fn, self.get_lifecycle_name()):
112 if not self.allows_multiple():
--> 113 raise ValueError(
114 f"Got multiple decorators for decorator @{self.__class__}. Only one allowed."
115 )
116 curr_value = getattr(fn, lifecycle_name)
117 setattr(fn, lifecycle_name, curr_value + [self])
ValueError: Got multiple decorators for decorator @<class 'hamilton.function_modifiers.adapters.LoadFromDecorator'>. Only one allowed.
Wentao Lu
07/24/2023, 11:18 PMRequirement already satisfied: sf-hamilton==1.23.2 in /local_disk0/.ephemeral_nfs/envs/pythonEnv-799ca980-f267-48bf-85bf-5c3956a3d512/lib/python3.9/site-packages (from renaissance==88b88d3) (1.23.2)
Elijah Ben Izzy
07/24/2023, 11:19 PMWentao Lu
07/24/2023, 11:19 PMElijah Ben Izzy
07/24/2023, 11:20 PMElijah Ben Izzy
07/24/2023, 11:27 PMfrom hamilton.function_modifiers import load_from, value
from hamilton import driver
from hamilton.ad_hoc_utils import create_temporary_module
@load_from.json(path=value("./test.json"), inject_="data_1")
@load_from.json(path=value("./test.json"), inject_="data_2")
@load_from.json(path=value("./test.json"), inject_="data_3")
def foo(data_1: dict, data_2: dict, data_3: dict) -> int:
return 1
if __name__ == "__main__":
mod = create_temporary_module(foo)
dr = driver.Driver({}, mod)
print(dr.execute(["foo"]))
Wentao Lu
07/24/2023, 11:30 PMElijah Ben Izzy
07/24/2023, 11:31 PMWentao Lu
07/24/2023, 11:31 PM@paremterize(
xxx
)
@load_from.json(path=value("./test.json"), inject_="data_2")
@load_from.json(path=value("./test.json"), inject_="data_3")
Wentao Lu
07/24/2023, 11:31 PMElijah Ben Izzy
07/24/2023, 11:31 PMElijah Ben Izzy
07/24/2023, 11:31 PMWentao Lu
07/24/2023, 11:32 PMWentao Lu
07/24/2023, 11:33 PMElijah Ben Izzy
07/24/2023, 11:33 PMWentao Lu
07/24/2023, 11:33 PMElijah Ben Izzy
07/24/2023, 11:33 PMValueError: Cannot call NodeExpander: <class 'hamilton.function_modifiers.expanders.parameterize'> on more than one node. This must be called first in the DAG. Called with [<foo {'module': 'temporary_module_57ee4391_b294_4c47_bc9c_fc388ace1822'}>, <load_data.foo.data_1 {'hamilton.data_loader': True, 'hamilton.data_loader.has_metadata': True, 'hamilton.data_loader.source': 'json', 'hamilton.data_loader.classname': 'JSONDataAdapter', 'hamilton.data_loader.node': 'data_1'}>, <data_1 {'hamilton.data_loader': True, 'hamilton.data_loader.has_metadata': False, 'hamilton.data_loader.source': 'json', 'hamilton.data_loader.classname': 'JSONDataAdapter', 'hamilton.data_loader.node': 'data_1'}>, <load_data.foo.data_2 {'hamilton.data_loader': True, 'hamilton.data_loader.has_metadata': True, 'hamilton.data_loader.source': 'json', 'hamilton.data_loader.classname': 'JSONDataAdapter', 'hamilton.data_loader.node': 'data_2'}>, <data_2 {'hamilton.data_loader': True, 'hamilton.data_loader.has_metadata': False, 'hamilton.data_loader.source': 'json', 'hamilton.data_loader.classname': 'JSONDataAdapter', 'hamilton.data_loader.node': 'data_2'}>]
Wentao Lu
07/24/2023, 11:34 PMElijah Ben Izzy
07/24/2023, 11:34 PMWentao Lu
07/24/2023, 11:34 PMWentao Lu
07/24/2023, 11:35 PMElijah Ben Izzy
07/24/2023, 11:35 PMElijah Ben Izzy
07/24/2023, 11:35 PMpython3 -c "import hamilton; print(hamilton.version.VERSION)"
Elijah Ben Izzy
07/24/2023, 11:35 PMWentao Lu
07/24/2023, 11:38 PMElijah Ben Izzy
07/24/2023, 11:38 PM(1,23,2)
Wentao Lu
07/24/2023, 11:39 PMWentao Lu
07/24/2023, 11:39 PMElijah Ben Izzy
07/24/2023, 11:39 PMElijah Ben Izzy
07/24/2023, 11:39 PMWentao Lu
07/24/2023, 11:40 PMWentao Lu
07/24/2023, 11:42 PMWentao Lu
07/24/2023, 11:42 PMdef load_input(inject_name: str):
def decorator(func):
wrapped = load_from.deltalake(
dag_env=source("dag_env"),
datestr=source("datestr"),
db_name=source("db_name"),
db_suffix=source("db_suffix"),
spark=source("spark"),
table=source("table"),
inject_=inject_name,
)(func)
# Overriding the signature with the original for the inspection purpose.
wrapped.__signature__ = signature(func)
return wrapped
return decorator
Wentao Lu
07/24/2023, 11:42 PMElijah Ben Izzy
07/24/2023, 11:44 PMfunctool.wraps
instead of wrapped.___signature___
, as it delegates to python. That said, did both of these work?Wentao Lu
07/24/2023, 11:44 PMElijah Ben Izzy
07/24/2023, 11:44 PMElijah Ben Izzy
07/24/2023, 11:45 PMWentao Lu
07/24/2023, 11:46 PMWentao Lu
07/24/2023, 11:46 PMWentao Lu
07/24/2023, 11:46 PMWentao Lu
07/24/2023, 11:47 PMElijah Ben Izzy
07/24/2023, 11:47 PMWentao Lu
07/24/2023, 11:47 PMWentao Lu
07/24/2023, 11:47 PMElijah Ben Izzy
07/24/2023, 11:47 PMElijah Ben Izzy
07/24/2023, 11:47 PMWentao Lu
07/24/2023, 11:47 PMElijah Ben Izzy
07/24/2023, 11:48 PMElijah Ben Izzy
07/24/2023, 11:48 PMWentao Lu
07/24/2023, 11:48 PMWentao Lu
07/24/2023, 11:49 PMWentao Lu
07/24/2023, 11:49 PMWentao Lu
07/24/2023, 11:49 PMElijah Ben Izzy
07/24/2023, 11:53 PM@inject
which can inject your nodes in, either as one function or as a group. https://hamilton.dagworks.io/en/latest/reference/decorators/inject/#hamilton.function_modifiers.inject
You could then do that in a for-loop. and if you’re feeling fancy, use the names of the functions from the other module to form the parameters for inject
Wentao Lu
07/24/2023, 11:53 PMElijah Ben Izzy
07/24/2023, 11:53 PMinject
Wentao Lu
07/24/2023, 11:53 PMElijah Ben Izzy
07/24/2023, 11:53 PMWentao Lu
07/24/2023, 11:54 PMElijah Ben Izzy
07/24/2023, 11:54 PMWentao Lu
07/24/2023, 11:55 PMWentao Lu
07/24/2023, 11:55 PMWentao Lu
07/24/2023, 11:55 PMElijah Ben Izzy
07/24/2023, 11:55 PMWentao Lu
07/25/2023, 9:27 PMWentao Lu
07/25/2023, 9:27 PMWentao Lu
07/25/2023, 9:28 PMElijah Ben Izzy
07/25/2023, 9:28 PMmain
you’re good to go.Wentao Lu
07/25/2023, 9:28 PMElijah Ben Izzy
07/25/2023, 9:28 PMElijah Ben Izzy
07/25/2023, 9:54 PMWentao Lu
07/25/2023, 9:54 PMWentao Lu
07/25/2023, 9:54 PMWentao Lu
07/25/2023, 9:56 PMWentao Lu
07/25/2023, 9:56 PMimport nodes
adapter = h_cache.CachingAdapter(cache_path, base.PandasDataFrameResult())
Wentao Lu
07/25/2023, 9:57 PMCachingGraphAdapter
Elijah Ben Izzy
07/25/2023, 9:57 PMElijah Ben Izzy
07/25/2023, 10:01 PMWentao Lu
07/25/2023, 10:01 PMWentao Lu
07/25/2023, 10:06 PMWentao Lu
07/25/2023, 10:07 PMcompute
that's cached with this adaptor but it's also overrode from execute(override=[...])
Wentao Lu
07/25/2023, 10:07 PMElijah Ben Izzy
07/25/2023, 10:08 PMexecute()
which is bypassed if there’s no override)Elijah Ben Izzy
07/25/2023, 10:08 PMWentao Lu
07/25/2023, 10:09 PMWentao Lu
07/25/2023, 10:09 PMElijah Ben Izzy
07/25/2023, 10:10 PMWentao Lu
08/01/2023, 5:56 PMWentao Lu
08/01/2023, 5:56 PMWentao Lu
08/01/2023, 5:56 PMWentao Lu
08/01/2023, 5:57 PMWentao Lu
08/01/2023, 5:57 PMWentao Lu
08/01/2023, 5:57 PMElijah Ben Izzy
08/01/2023, 6:00 PMWentao Lu
08/01/2023, 6:00 PMWentao Lu
08/01/2023, 6:00 PMElijah Ben Izzy
08/01/2023, 6:00 PMWentao Lu
08/01/2023, 6:00 PMElijah Ben Izzy
08/01/2023, 6:01 PMElijah Ben Izzy
08/01/2023, 6:01 PMcProfile
— but it’ll give you the info you needElijah Ben Izzy
08/01/2023, 6:02 PMWentao Lu
08/01/2023, 6:02 PMElijah Ben Izzy
08/01/2023, 6:31 PMWentao Lu
08/01/2023, 6:57 PMWentao Lu
08/01/2023, 6:58 PMWentao Lu
08/01/2023, 7:00 PMWentao Lu
08/01/2023, 7:00 PMElijah Ben Izzy
08/01/2023, 7:01 PMWentao Lu
08/01/2023, 7:01 PMWentao Lu
08/01/2023, 7:02 PMDf1.join(df2, xx).join(df3, xxx)
Wentao Lu
08/01/2023, 7:03 PMfeature.join(feature2, x).join(feature3, x) ... (x200) and def feature_x: df.select(col, backbone)
Elijah Ben Izzy
08/01/2023, 7:03 PMWentao Lu
08/01/2023, 7:03 PMWentao Lu
08/01/2023, 7:03 PMWentao Lu
08/01/2023, 7:03 PMElijah Ben Izzy
08/01/2023, 7:04 PMElijah Ben Izzy
08/01/2023, 7:04 PMWentao Lu
08/01/2023, 7:05 PMWentao Lu
08/01/2023, 7:06 PMCachingGraphAdapter
Elijah Ben Izzy
08/01/2023, 7:07 PMWentao Lu
08/01/2023, 7:07 PMWentao Lu
08/01/2023, 7:08 PMfinal_vars
Wentao Lu
08/01/2023, 7:08 PMElijah Ben Izzy
08/01/2023, 7:15 PMinject
?)Wentao Lu
08/01/2023, 7:16 PMWentao Lu
08/01/2023, 7:16 PMElijah Ben Izzy
08/01/2023, 7:17 PMWentao Lu
08/01/2023, 7:17 PMElijah Ben Izzy
08/01/2023, 7:17 PMElijah Ben Izzy
08/01/2023, 7:17 PMWentao Lu
08/01/2023, 7:17 PMElijah Ben Izzy
08/01/2023, 7:18 PMWentao Lu
08/01/2023, 7:19 PMresult: DataFrame = T.pipe(
T.reduce(
lambda df1, df2: df1.join(df2, on=[BONE_INDEX], how="left"),
[
feature_1,
feature_2,
feature_3,
...
Elijah Ben Izzy
08/01/2023, 7:21 PMWentao Lu
08/01/2023, 7:21 PMElijah Ben Izzy
08/01/2023, 7:22 PMStefan Krawczyk
08/01/2023, 8:51 PMWentao Lu
08/01/2023, 8:59 PMWentao Lu
08/01/2023, 8:59 PMWentao Lu
08/01/2023, 9:00 PMStefan Krawczyk
08/01/2023, 9:00 PMWentao Lu
08/01/2023, 9:00 PMStefan Krawczyk
08/01/2023, 9:01 PMElijah Ben Izzy
08/01/2023, 9:02 PMElijah Ben Izzy
08/01/2023, 9:07 PMWentao Lu
08/01/2023, 9:07 PM