So your options are:
Hash Key | Range Key | Attributes
----------------------------------
user id | utc time | json data
----------------------------------
user123 | 1357306017 | {UserID1:0, UserID2:0, Message:"", DateTime:0}
or
Hash Key | Range Key | Attributes
--------------------------------------------------------------
user id | utc time | UserID1 | UserID2 | Message | DateTime
--------------------------------------------------------------
user123 | 1357306017 | 0 | 0 | "" | 0
Both are viable options, and the choice comes down to how you want to read the data, if you have an attribute for each item, then you can request those attributes individually.
We tend to use a hybrid approach based upon our usage patterns. Elements we need to access individually are given their own attributes. Elements that we only ever want to access along with a collection of other elements all get assigned a single attribute and are then stored as a single blob of JSON string or a base64 encoded data.
For part two, indeed, you are right, you don't need to store user id and date time again as part of the attributes because they are the hash and range keys, which are returned when you make a request.