The Australian becomes the seventh different driver to triumph in the last 13 races.
Lewis Hamilton, of Mercedes, took third - ahead of Norris - while Ferrari's Charles Leclerc finished fourth.
Red Bull's Max Verstappen was third on the grid, but lagged begind in fifth.
Speaking after his win, Piastri said: "It's a hell of a lot of fun racing with McLaren."
![Piastri and Norris embrace after the race Piastri and Norris embrace after the race](https://livesport-ott-images.ssl.cdn.cra.cz/r900xfq60/35b45aad-a82c-495b-bc72-729594b0fabc.jpg)
Piastri's win - with Norris in second - signifies McLaren's first 1-2 in three years.
"(An) amazing day for us as a team. Oscar controlled the race and deserved (the win) today," said Norris, who had been urged by his team to let Piastri through in the closing laps.
"This is really the day I dreamed of as a kid," added Piastri.
Top 10
Oscar Piastri (McLaren)
Lando Norris (McLaren)
Lewis Hamilton (Mercedes)
Charles Leclerc (Ferrari)
Max Verstappen (Red Bull)
Carlos Sainz (Ferrari)
Serio Perez (Red Bull)
George Russell (Mercedes)
Yuki Tsunoda (RB)
Lance Stroll (Aston Martin)