Spark structured streaming works on the concept of micro-batches. Real streaming never existed in the case of DStreams.
DStreams was built on Resilient Distributed Datasets (RDDs). So, many optimisations that were performed on DataFrames and Datasets were missing, and, consequently, memory optimisations were also missing since RDDs are a non-type data structure.
The lateness of data was not handled properly and also, fault tolerance was not in place for driver programs.
All of these disadvantages were eliminated in Spark structured streaming.