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
A few years ago @vickiboykis.com posted a sample of post modern jukebox in this category. In tech this year, one example was the first time I used @crmarsh.com `uv pip install` I'm curious if folks have others? But anyway, this vid from a few years ago is my recent go-to example
030
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 · 17/12/2024
I see what you did there, and I am not honoring it with a heart reaction.
110
Sean Lopp @loppsean.bsky.social · 17/12/2024
what makes me happy is thinking someone at HPE had to have a convo with AWS and SAP, where SAP argued it'd be easier to build a machine with >1000 CPU and 32TB of RAM than figure out how to run SAP on more than one node
060
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
but did you like santa or rudolph daggie?
100
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
Sean Lopp @loppsean.bsky.social · 27/11/2024
Probably not? I think there are generally 3 viable options: - deploy to Dagster+ serverless: great for individuals playing around who want to run their hobby project - deploy OSS Dagster: this quickly becomes a "choose your own adventure" - deploy Dagster+ as a team in prod
000
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
ffs @msft365.bsky.social . ffs.
000
Sean Lopp @loppsean.bsky.social · 26/11/2024
For the benefit of customers that are familiar with Power BI, the table also includes Power BI Premium per capacity P SKUs and v-cores. Power BI Premium P SKUs support Microsoft Fabric. A and EM SKUs only support Power BI items.
100
Sean Lopp @loppsean.bsky.social · 26/11/2024
The capacity and SKUs table lists the Microsoft Fabric SKUs. Capacity Units (CU) are used to measure the compute power available for each SKU.
100
Sean Lopp @loppsean.bsky.social · 26/11/2024
Capacities are split into Stock Keeping Units (SKUs). Each SKU provides a set of Fabric resources for your organization. Your organization can have as many capacities as needed.
100
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
Someone once told me, "typos prove you're human leave them in"
010
Sean Lopp @loppsean.bsky.social · 25/11/2024
I mean everywhere I turn, its a rough edge. eg I hit an error about my subscription not having an associated resource group. I go to the resource group page and am presented with:
The azure portal being a PoS
000
Sean Lopp @loppsean.bsky.social · 25/11/2024
And don't get me started on how Power BI is part MSFt 365, part Azure Fabric This means you can royally screw up Power BI subscriptions in like 3 places!
300
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
But would the hidden column in sheet 38 of spreadsheet "final_ups_bill_v2.updated_2019.sap_export5" catch your eye?
010
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
A more fun summary would be: "Top 10 python error messages you entered in chatgpt, because you can't be bothered to learn, can you sentient being?" As I type this. A request for "If chatgpt was a guy" www.youtube.com/watch?v=YuOB...
youtube.com
If Google Was A Guy
YouTube video by Dropout
000
Sean Lopp @loppsean.bsky.social · 22/11/2024
Coming soon to a BI tool near you: VBA macros. Let's GO
120
Sean Lopp @loppsean.bsky.social · 22/11/2024
github.com/slopp/30_day...
github.com
GitHub - slopp/30_days_of_dagster: Advent of code - 30 challenges for learning Dagster
Advent of code - 30 challenges for learning Dagster - GitHub - slopp/30_days_of_dagster: Advent of code - 30 challenges for learning Dagster
000
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 · 20/11/2024
www.youtube.com/watch?v=rB2n... First video is live!
youtube.com
Data Platform Week - Day 1 Keynote
YouTube video by Dagster
000
Sean Lopp @loppsean.bsky.social · 19/11/2024
matplotlib still sucks though - python, matlab, its all bad
110
Sean Lopp @loppsean.bsky.social · 19/11/2024
Living in 2013, grad math classes all taught matlab, but national research labs were cheap... Spyder was behind pretty much all my research publications Thanks for the trip down memory lane sir
120
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