A Decimal has a precision and scale value, by default the precision is 10 and scale is 0.
The precision is the maximum number of digit in your number. In your case you have more than 10 digits so the number can't be cast to a 10 digits Decimal and you have null values.
To avoid that you need to specify a precision large enough to represent your numbers :
dframe.withColumn("c_number", dframe.col("c_a").cast(new DecimalType(38,0)))
Note that the precision can be up to 38