Sign in

Sean Lopp

@loppsean.bsky.social
598 followers 322 following 70 posts

Dagster, RStudio, Looker. Dad. Bikes. Coffee.

PostsRepliesMedia
Sean Lopp @loppsean.bsky.social · 08/01/2025
Are people calling the Nvidia cosmos paper the next "attention is all you need" but for physical AI systems?
020
Sean Lopp @loppsean.bsky.social · 20/12/2024
tldr www.youtube.com/watch?v=TRCJ... End of year we tend to reflect on "Best of...". I've been thinking of _craft excellence_, eg cases where someone produces a masterpiece, an example of them just being excellent at their craft.
youtube.com
Chance the Rapper Performs a Country Version of Nelly’s “Hot in Herre” | That’s My Jam
YouTube video by The Tonight Show Starring Jimmy Fallon
120
Sean Lopp @loppsean.bsky.social · 20/12/2024
Day 18, happy holidays friends! youtu.be/GjndggmuhCs
youtu.be
30 Days of Orchestration - Day 18
YouTube video by Sean Lopp @ Dagster Labs
161
Sean Lopp @loppsean.bsky.social · 19/12/2024
Day 17! Today's challenge is about conditional branching in data pipelines youtu.be/MgkniMnmhMU
youtu.be
30 Days of Orchestration - Day 17
YouTube video by Sean Lopp @ Dagster Labs
020
Sean Lopp @loppsean.bsky.social · 18/12/2024
Day 16! youtu.be/mrlFdKJlosY (sorry for no video on day 15... life ya know)
youtu.be
30 Days of Orchestration - Day 16
YouTube video by Sean Lopp @ Dagster Labs
020
Sean Lopp @loppsean.bsky.social · 16/12/2024
Day 14 and mayyybbbbee my favorite day so far. Dynamic code gen and peeling back the onion on ways to combine different Python parallelization "layers" .... what more could you want for a Monday? youtu.be/azfCDBKTIoQ
youtu.be
30 Days of Orchestration - Day 14
YouTube video by Sean Lopp @ Dagster Labs
152
Sean Lopp @loppsean.bsky.social · 13/12/2024
Lucky Day 13 - all about incremental data processing youtu.be/_WSOaE5mr4g
youtu.be
30 Days of Orchestration - Day 13
YouTube video by Sean Lopp @ Dagster Labs
020
Reposted by Sean Lopp
Christian Minich @christianminich.com · 11/12/2024
@loppsean.bsky.social's walk through of asset checks in Day 11 is awesome, do check it out! In some cases, you might not want to re-read in the asset data (or you might even want to compare across previous materializations!) In my example, I use Dagster's metadata system to do just that.
@dg.asset(
        deps=[csv_external_asset],
        automation_condition=dg.AutomationCondition.on_cron("* * * * *"),
)
def orders(context: dg.AssetExecutionContext, csv_storage: CsvStorageResource) -> None:
    orders = csv_storage.read_data('orders_raw.csv')
    context.log.info(f"Creating asset one with data: {orders.head()}")
    # directly write csv to storage
    csv_storage.write_data(orders, 'orders.csv')
    return dg.MaterializeResult(
        metadata={
            "dagster/row_count": dg.MetadataValue.int(len(orders)), 
            "preview": dg.MetadataValue.md(orders.head().to_markdown()),
            "dagster/column_schema": create_table_schema_metadata_from_dataframe(orders)
        }
    )


@dg.asset_check(asset="orders")
def orders_increasing_or_equal(context: dg.AssetCheckExecutionContext) -> dg.AssetCheckResult:
    histotical_metadata = context.instance.fetch_materializations(
        dg.AssetRecordsFilter(
            asset_key=dg.AssetKey("orders"),
         ),
         limit=2
    )

    if len(histotical_metadata) < 2:
        return dg.AssetCheckResult(passed=True)
    row_count_values = [
        record.asset_event.metadata.get("dagster/row_count") for record in histotical_metadata[0]
    ]
    latest_row_count = row_count_values[0]
    previous_row_count = row_count_values[1]
    
    return dg.AssetCheckResult(
        passed=latest_row_count>=previous_row_count,
        metadata={"latest_row_count": latest_row_count, "previous_row_count": previous_row_count}
    )dagster asset check run showing latest row count of 99 and current row count of 100
162
Sean Lopp @loppsean.bsky.social · 11/12/2024
Day 11! The diff between orchestration and data orchestration? Your code can stay the same, still work, but the data can change and break everything! youtu.be/ugS1KQhxWrA
youtu.be
30 Days of Orchestration - Day 11
YouTube video by Sean Lopp @ Dagster Labs
000
Reposted by Sean Lopp
Christian Minich @christianminich.com · 10/12/2024
For day 10 of 30 days of orchestration, one of my fave topics: materializing assets in different environments using resources! In my solution to day 10, I added an environment variable, DAGSTER_PROD_DEPLOY, which determines whether to use the folder `data_prod` or `data_dev` if it is not present.
# define a resource that can read and write data
class CsvStorageResource(dg.ConfigurableResource):
    base_dir: str = os.path.join(
        os.path.dirname(os.path.dirname(os.path.abspath(__file__))),
        "data",
    )

    def read_data(self, csv_file):
        return pd.read_csv(os.path.join(self.base_dir, csv_file) )
    
    def write_data(self, df, csv_file):
        return df.to_csv(os.path.join(self.base_dir, csv_file), index=False )


# define an asset that represents an external CSV file
csv_external_asset = dg.AssetSpec(
    key = "csv_external_asset",
    description="A CSV file that is external to Dagster. If you have issues call 866-5309",
    metadata={"file_path": dg.MetadataValue.path("data/orders_raw.csv"),
            },
    owners=["team:Upstream_Ops", "upstream_ops_person@company.com"],
    kinds=["file","csv"],
)

@dg.asset(
        deps=[csv_external_asset],
        automation_condition=dg.AutomationCondition.on_cron("* * * * *"),
)
def orders(context: dg.AssetExecutionContext, csv_storage: CsvStorageResource) -> None:
    orders = csv_storage.read_data('orders_raw.csv')
    context.log.info(f"Creating asset one with data: {orders.head()}")
    # directly write csv to storage
    csv_storage.write_data(orders, 'orders.csv')
    return dg.MaterializeResult(
        metadata={
            "dagster/row_count": dg.MetadataValue.int(len(orders)), 
            "preview": dg.MetadataValue.md(orders.head().to_markdown()),
            "dagster/column_schema": create_table_schema_metadata_from_dataframe(orders)
        }
    )

@dg.asset(
        deps=["orders_summary"],
         automation_condition=dg.AutomationCondition.on_cron("*/10 * * * *")
)
def asset_three(context: dg.AssetExecutionContext) -> None:
    context.log.info("Creating asset three")

# define the resources to use different folders for different "environments"
resource_defs = {
        "DEV":{"csv_storage": CsvStorageResource(base_dir="/Users/christian/code/30_days_of_dagster/data…image showing that the definition of the csv_storage resource was /Users/christian/code/30_days_of_dagster/data_prod.env file with DAGSTER_PROD_DEPLOY=1
122
Sean Lopp @loppsean.bsky.social · 10/12/2024
Day 10! Data engineers + Pydantic classes = goodness. youtu.be/f_XfLTlHS-s
youtu.be
30 Days of Orchestration - Day10
YouTube video by Sean Lopp @ Dagster Labs
082
Sean Lopp @loppsean.bsky.social · 09/12/2024
Day 9! youtu.be/g4oABNiIOmw
youtu.be
30 Days of Orchestration - Day 9
YouTube video by Sean Lopp @ Dagster Labs
031
Sean Lopp @loppsean.bsky.social · 06/12/2024
Daty 8, happy Friday! youtu.be/iroAyNM0kxA
youtu.be
30 Days of Orchestration - Day 8
YouTube video by Sean Lopp @ Dagster Labs
000
Sean Lopp @loppsean.bsky.social · 05/12/2024
Day 7! youtu.be/u9V0As2RZ5k
youtu.be
30 Days of Orchestration - Day 7
YouTube video by Sean Lopp @ Dagster Labs
010
Sean Lopp @loppsean.bsky.social · 04/12/2024
Day 6! youtu.be/RSUk6DU531w
youtu.be
30 Days of Orchestration - Day 6
YouTube video by Sean Lopp @ Dagster Labs
020
Sean Lopp @loppsean.bsky.social · 03/12/2024
Day 5! youtu.be/jNCaAYA-MVU
youtu.be
30 Days of Orchestration - Day 5
YouTube video by Sean Lopp @ Dagster Labs
010
Sean Lopp @loppsean.bsky.social · 02/12/2024
Day 4! (Its not too late to catch up!) youtu.be/Jaann2QiGwQ
youtu.be
30 Days of Orchestration - Day 4
YouTube video by Sean Lopp @ Dagster Labs
041
Sean Lopp @loppsean.bsky.social · 27/11/2024
Day 3! youtu.be/xUJTal1cq0Y Learn about more complex DAG scheduling, and get a sneak peek of holiday Daggie
youtu.be
30 Days of Orchestration - Day 3
YouTube video by Sean Lopp @ Dagster Labs
020
Reposted by Sean Lopp
Christian Minich @christianminich.com · 26/11/2024
Here is my solution: github.com/cnolanminich... For this one, I wanted to play with the new `target` argument 🤩 For the super common scenario of having one job per schedule, add a "target" argument and select the assets you want -- in my case "asset_one" and everything downstream #dataBS
schedule_every_minute = dg.ScheduleDefinition(
    name="schedule_every_minute",
    target= "asset_one*",
    cron_schedule="* * * * *",  # runs every minute
)
041
Sean Lopp @loppsean.bsky.social · 26/11/2024
Me trying to figure out Power BI pricing To share content and collaborate in Microsoft Fabric, your organization needs to have an F or P capacity, and at least one per-user license.
210
Sean Lopp @loppsean.bsky.social · 26/11/2024
Day 2! Its a holiday week, lets talk how you accommodate business schedules with cron youtu.be/Wja1EmyIexE
youtu.be
30 Days of Orchestration - Day 2
YouTube video by Sean Lopp @ Dagster Labs
000
Sean Lopp @loppsean.bsky.social · 25/11/2024
I've spent time in all 3 cloud provider consoles, unequivocally Azure is the worst. I don't mean to offend ... If I am.... DM me. Maybe you can show me the ropes? Example: the organization > account > subscription hierarchy, when applied to roles, is insane. I am sudo. Respect my authority!
110
Sean Lopp @loppsean.bsky.social · 25/11/2024
Lets GO! Day 1 of 30 days of orchestration youtu.be/RP6B1wXug_0 This will certainly be the most contentious video, because it starts by creating a Python environment (and of course, includes debugging said environment live).
youtu.be
30 Days of Orchestration - Day 1
YouTube video by Sean Lopp @ Dagster Labs
273
Sean Lopp @loppsean.bsky.social · 22/11/2024
youtu.be/A3VUD1dRfvA
youtu.be
30 Days of Orchestration - Day 0
YouTube video by Sean Lopp @ Dagster Labs
111
Sean Lopp @loppsean.bsky.social · 20/11/2024
There are two types of Git commit messages: 8:00am: ae678pt: "as described in the linked RFC, implementing changes to the partition strategy to reduce hotspots in our cluster index" 4:49pm: stcm98: "f-ing typos, try again. pleeeeease pass"
050
Sean Lopp @loppsean.bsky.social · 20/11/2024
ok friends. if you do cron, airflow, dagster... _please_ watch this 5 minute snippet its the crux of everything we at Dagster have been working on for redefining DAG automation, and I think it could save you from a lot of PITA headaches youtu.be/Z77s50b_Sks?...
youtu.be
Data Platform Week Day 2 - Core Orchestration: Event-driven automation and native partitioning
YouTube video by Dagster
2112
Sean Lopp @loppsean.bsky.social · 19/11/2024
Sometimes people want to know what a sales engineer does Its this www.youtube.com/watch?v=hNuu...
youtube.com
I have people Skills Office Space
YouTube video by AMAN SINGH
010
Sean Lopp @loppsean.bsky.social · 19/11/2024
Another DOGE suggestion Require 401k providers to give you the option to initiate a rollover to another firm without talking to their shitty sales team and _faxing_ forms.
130
Sean Lopp @loppsean.bsky.social · 19/11/2024
Week of cool @dagster.io releases going on right now! 📆 dagster.io/data-platfor... (this link will have you register, give you a cal invite, and you can watch the videos via a live stream each day) OR ⏩ DM me and I'll send you the youtube videos when they're uploaded later on
dagster.io
Data Platform Week | Dagster
...
101
Reposted by Sean Lopp
arynndoesdata @arynn.bsky.social · 19/11/2024
I'm obsessed with everything about this video. If a prospect stops responding to me, I'm just gonna send them this link. youtu.be/Am7kr_lLbsw?...
youtu.be
Better off Alone (Live Looping)
YouTube video by Saxsquatch
2152
Sean Lopp @loppsean.bsky.social · 19/11/2024
The real DOGE would be eliminating SAS and paper submissions ... iykyk (Too soon, serious, or scary to shit post about... perhaps) But really, in the year of our lord 2024, people still can't decide how to validate R (a pharma once told me they mailed in the printed out source code of R core)
120
Sean Lopp @loppsean.bsky.social · 18/11/2024
Leading a sales engineering team is weird. Call: "Do how should we handle late arriving data?" Me: "The only late arriving data I've dealt with in 2 years is the slack message with the context for this call... that I just got" It's not impost syndrome when you're actually an imposter
010
Sean Lopp @loppsean.bsky.social · 18/11/2024
Realized today my daughter may never have to balance a check book. We live in a time when even the old church ladies take venmo I miss the days of old where they'd take a check and you'd just wait... and wait... to see if they ever cashed it Tech takes the suspense out of life!
020
Sean Lopp @loppsean.bsky.social · 17/11/2024
One from the archives. In 2022 I worked at Google and wanted to be a thought leader loppsided.blog/posts/2022-0...
loppsided.blog
Loppsided: Modern Data Stack_s_?
An argument and map for 4 modern data stacks.
010
Sean Lopp @loppsean.bsky.social · 16/11/2024
New post about bikes: loppsided.blog/posts/2024-1... PRO: It's pretty amazing that the pipeline I set up in 2019, distill + Rmd + Netlify, still works. Thanks, JJ CON: The in-line RMD spellcheck/Grammarly experience is very 2019, and apparently, I've developed crutches. Advice?
loppsided.blog
Loppsided: Bike Check 2024
Talking about bikes
131
Sean Lopp @loppsean.bsky.social · 15/11/2024
modal.com/blog/the-fut... Great example of using simulation to inform product strategy. Any other examples folks know of?
modal.com
The future of AI needs more flexible GPU capacity
Why Modal is obsessed with serverless AI infrastructure
000
Reposted by Sean Lopp
Bram Zijlstra @bramzijlstra.com · 13/11/2024
I hope my friends never find out. #databs
Rick and Morty "You pass butter Meme". 
"What's my purpose?"
"You write YAML"
"Oh god."
1142
Sean Lopp @loppsean.bsky.social · 14/11/2024
It took me too long in my career to figure this out, so re-posting here If you use Python with VS Code, be sure to add these settings: "python.languageServer": "Pylance", "python.analysis.typeCheckingMode": "basic" This will give you a super power: not messing up Python typed arguments
A pylance error message in vs code describing an incorrect type
020
Sean Lopp @loppsean.bsky.social · 13/11/2024
Reading Nvidia blog posts - true gems in there, but tons of 3 letter acronym syndrome Then saw this horrific Snowflake ad with the gag play on words "RAG and Roll". So here is my Nvidia rap: Grab the NIM from the NGC, use NEMO and Llama3, finish with TAO via LlangGraph, and hit me with TensorRT!
170
Sean Lopp @loppsean.bsky.social · 12/11/2024
Am I the only one subject to: - Chrome always has an update, even after an update, and so 1password never lets me sign in with fingerprint - I have Chrome set to "open a blank page", but whenever it has a pending update, it defaults to "open all the old tabs" Paper cuts on paper cuts
000
Sean Lopp @loppsean.bsky.social · 12/11/2024
Dagster is to Airflow as ________ is to LangGraph Really enjoying this agent RAG tutorial, but creating the DAG feels fairly verbose? github.com/NVIDIA/Gener... Also, since when did "writing software" get rebranded to "agentic" ?
github.com
GenerativeAIExamples/RAG/notebooks/langchain/agentic_rag_with_nemo_retriever_nim.ipynb at main · NVIDIA/GenerativeAIExamples
Generative AI reference workflows optimized for accelerated infrastructure and microservice architecture. - NVIDIA/GenerativeAIExamples
010
Sean Lopp @loppsean.bsky.social · 11/11/2024
👋 I guess my introduction to Blue Sky would be - Try packagemanager.posit.co/client/#/ to source R and Python packages - Consider uv to install python packages instead of pip My espresso setup is currently a 9Barista. I have lots of bikes and try to ride them every day.
packagemanager.posit.co
Posit Package Manager
3363