Cardinals rookie Dakota Hudson tossed six innings of five-hit ball, Royals counterpart Brad Keller allowed a no-hit bid to crumble in spectacular fashion, and St. Louis went on to beat Kansas City 6-0 on Wednesday night for a two-game sweep.

Hudson (11-6) allowed runners to reach every inning but the third, but the 24-year-old right-hander kept getting timely double-plays, groundballs and fly outs. Hudson struck out five and walked two as the Cardinals won for the 13th time in his last 16 starts.

They also won their eighth straight against their cross-state rival at Kauffman Stadium.

Keller (7-13) issued three walks and was victimized by an early error, but he didn’t allow a hit until Marcell Ozuna’s sharp single leading off the seventh. It began a run of five consecutive base hits that not only knocked Keller from the game but ultimately resulted in a five-run frame.

Keller has lost four straight on the heels of a six-start span without a defeat.

The Royals, who were blanked 2-0 on Tuesday night, never got a runner past second base. Cheslor Cuthbert grounded out to strand two in the first, Nicky Lopez stranded runners in the second and fifth, and Bubba Starling grounded out to leave Ryan O’Hearn standing on second base in the fourth.

The Cardinals were following a similar roadmap until Ozuna’s single in the seventh.

Paul DeJong and Matt Carpenter followed with hits to send Keller to the showers, and Yadier Molina and Kolten Wong followed with singles of their own. By the time Randy Arozarena singled for his first big league hit and Dexter Fowler hit a sacrifice fly, the Cardinals had taken a 5-0 lead.

DeJong added a mammoth homer in the eighth for his 20th home run, making him the first Cardinals shortstop with two seasons of at least 20 homers. DeJong hit 25 as a rookie in 2017.